小言_互联网的博客

spring IOC 常用注解一(简单类型数据装配及其他Bean的引用)详解

273人阅读  评论(0)

前言: 有粉丝评论我之前的博客文字太少了,打算从这篇博客开始多增加一些文字内容的介绍,欢迎各位粉丝提建议,博主更加努力写博客,为了让大家可以拿去解决一些问题,欢迎各位一起讨论,共同进步早日进大公司,加油!加油!

*spring四个常用注解用户装配Bean

一:@Component 此注解使用在class上来声明一个Spring组件(Bean), 将其加入到应用上下文中 ,添加到IOC容器中,不区分组件类型。

二:@Controller 此注解表示Action层的组件,用在Action层,在类上添加,目的是将Action的实现类添加到IOC容器中,是@Component注解的一种具体形式。

三:@Service 此注解表示Service(业务)层组件,在class类上添加表示是一个业务类执行一些业务逻辑等, 目的是将Service层的实现类添加到IOC容器中,是@Component注解的一种具体形式。

四:@Repositor 此注解表示Dao层组件 在Dao层实现类上面添加用于访问数据库,目的是将Dao的实现类添加到IOC容器中。

**spring四个常用注解属性注入

一:@Value 此注解使用在字段、构造器参数和方法参数上。@Value可以指定属性取值的表达式,支持通过#{}使用SpringEL来取值,也支持使用${}来将属性来源中(Properties文件、本地环境变量、系统属性等)的值注入到bean的属性中,它用来注入基本数据类型,不能注入引用数据类新。
二:@Resource 集合的数据装配 使用的是@Resource 默认是按Byname进行数据装配。
三:@Autowired 使用的是spring提供的 数据装配,默认是ByType匹配 当存在多个同名Bean的时候是ByName匹配,
此注解用于其他bean的引用、setter方法以及构造方法上,显式地声明依赖。根据ByType匹配来自动注入。
当在其他Bean引用上使用此注解,并且使用属性来传递值时,Spring会自动把值赋给此field。也可以将此注解用于私有属性(不推荐),如下。

@Component
public class User {
    @Autowired
    private Customer custoemr;
}

最经常的用法是将此注解用于settter上,这样可以在setter方法中添加自定义代码。如下:


@Component
public class User {
   private Customer customer;
    
   @AutoWired
   public setCustomer(Customer customer) {
      this.customer = customer;
   }
}

在构造方法上使用@Autowired注解的时候,需要注意的一点就是一个类中只允许有一个构造方法使用此注解。
此外,在Spring4.3后,如果一个类仅仅只有一个构造方法,即使不使用此注解,那么Spring也会自动注入相关的bean在IOC容器中。如下:

@Component
public class User {
   private Customer customer;
   
   public setCustomer(Customer customer) {
      this.customer = customer;
   }
}
<!--在IOC容器中会自动的注入Bean-->
<bean id="user" class="com.aliwo.user"/>

四:@Qualifier 此注解是和@Autowired一起使用的。使用此注解可以让你对注入的过程有更多的控制。
@Qualifier可以被用在单个构造器或者方法的参数上。当上下文有几个相同类型的bean, 使用@Autowired则无法区分要绑定的bean,此时可以使用@Qualifier来指定名称 如下:

@Component
public class User {
    @Autowired
    @Qualifier("customer1")
   private Customer customer;
}

一个作用范围的注解

@Scope:用于指定bean的作用域,一般就是singleton(单例)和prototype(非单例)

一个实例化时机的注解

@Lazy:懒加载 实例化的时候加载 单例的

两个生命周期的注解

@PostConstruct 初始化方法相当于 init-method=""

@PostConstruct
public void init() {
    System.out.println("初始化方法");
}                    

@PreDestroy 销毁方法相当于 destroy-method=" "

@PreDestroy
public void destroy(){
    System.out.println("销毁方法");
}

***简单数据类型的装配

使用maven搭建的项目:项目目录如下:

第一步扫描包这个是使用注解(组件)的前提添加在spring.xml文件中引入<context:component-scan base-package=""/>命名空间
配值spring.xml配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
              http://www.springframework.org/schema/context
              http://www.springframework.org/schema/context/spring-context.xsd">

    <!--第一步扫描包使用注解开发的前提条件 扫描的是使用注解类所在的包下,可以定义多个-->
    <context:component-scan base-package="annotation01.entity"/>
    
    <!--数据装配,读取配置文件的一种方式-->
    <!--<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="location" value="classpath:info.properties"/>
    </bean>-->
    
     <!--数据装配,读取配置文件的二种方式,基于命名空间的读取配置文件,在实际开发中推荐使用-->
    <context:property-placeholder location="info.properties"/>

    <bean id="cu" class="annotation01.entity.Customer">
        <property name="username" value="xuyayuan"/>
        <property name="sex" value="man"/>
    </bean>
    
</beans>

上面配置中读取配置文件的配置 在resources资源根目录下配置info.properties文件

jdbc.username=admin
password=admins

书写使用注解的实体类简单数据类型

package annotation01.entity;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Lazy;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;
import java.util.*;

/**
 * package_name:annotation01.entity
 *
 * @author:徐亚远 Date:2020/2/20 16:56
 * 项目名:springDemo01
 * Description:TODO
 * Version: 1.0
 **/
//默认 Bean的名字id为类的首字母小写
//@Component("us")
@Component
//懒加载 实例化的时候加载 单例的
//@Lazy
//作用域表明非单例的
@Scope("prototype")
public class User {
    /**
     * 简单数据类型的数据
     */
    @Value("${jdbc.username}")
    private String username;
    @Value("${password}")
    private String password;
    @Value("22")
    private Integer num;
    @Value("true")
    private Boolean flag;
    /**其他Bean的引用*/
    /**
     * @Autowired 方式一:使用的是spring提供的
     * 数据装配
     * 默认是ByType匹配 当存在多个同名Bean的时候是ByName匹配
     * 结合 @Qualifier("cu")指定特定的名字
     * 方式二: 使用@Resource 是javaEE提供的用法和@Autowired用法一样
     */
   /* @Autowired
    @Qualifier("cu")*/
    @Resource
    private Customer customer;


    /**构造方法*/
    public User() {
    }

    /**
     * 初始化方法
     * @PostConstruct 相当于 init-method=""
     */
    @PostConstruct
    public void init() {
        System.out.println("初始化方法");
    }
    /**
     * 销毁方法
     * @PreDestroy 相当于 destroy-method=""
     */
    @PreDestroy
    public void destroy(){
        System.out.println("销毁方法");
    }

    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", num=" + num +
                ", flag=" + flag +
                ", customer=" + customer +
                '}';
    }
}

其他Bean的引用实体类Customer类

package annotation01.entity;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;

/**
 * package_name:annotation01.entity
 *
 * @author:徐亚远 Date:2020/2/20 17:52
 * 项目名:springDemo01
 * Description:TODO
 * Version: 1.0
 **/
@Component
public class Customer {

    @Value("customer")
    private String username;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    @Value("woman")
    private String sex;

    @Override
    public String toString() {
        return "Customer{" +
                "username='" + username + '\'' +
                ", sex='" + sex + '\'' +
                '}';
    }
}

配置测试类

package annotation01.controller;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * package_name:annotation01.controller
 *
 * @author:徐亚远 Date:2020/2/20 16:56
 * 项目名:springDemo01
 * Description:TODO
 * Version: 1.0
 **/

public class UserController {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("annotation01/spring.xml");
        System.out.println(ac.getBean("user"));
        System.out.println("========");
        System.out.println(ac.getBean("customer"));
        //ac.destroy();
        System.out.println(ac.getBean("user")==ac.getBean("user"));
    }
}

运行结果如图:


转载:https://blog.csdn.net/weixin_43311650/article/details/104536293
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场