• 【Spring】Spring Bean的4种依赖注入方式


    前言

    所谓依赖注入,其实就是给对象里的属性赋值,因为对象里有其他对象,因此就形成了依赖。Spring有4种方式来给属性赋值:

    1. 构造方法注入
    2. set方法注入
    3. 自动装配
    4. 注解

    1. 构造方法注入

    构造方法注入是指在构造方法中注入属性或者对象来实现依赖注入,如下所示,在标签中定义一个id为userDaoImpl的Bean,并通过注入了name为username,value为admin的值,注入完成后直接通过this.username获取到值admin。其中引用类型使用ref属性,基本类型使用value属性。

    public class UserDaoImpl {
    
        private String username;
    
        public UserDaoImpl(String username) {
            this.username = username;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
      <bean id="userDaoImpl" class="com.example.UserDaoImpl">
          <constructor-arg name="username" value="admin">constructor-arg>
      bean>
    
    • 1
    • 2
    • 3

    2. set方法注入

    set方法注入就是通过在类中实现get、set方法来实现属性或者对象的依赖注入,如下所示,在标签中定义一个id为userDaoImpl的Bean,并通过注入了name为username,value为admin的值,注入完成后直接通过getUsername()获取到值admin。

    public class UserDaoImpl {
    
        private String username;
    
    
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    <bean id="userDaoImpl" class="com.example.UserDaoImpl">
        <property name="username" value="admin">property>
    bean>
    
    • 1
    • 2
    • 3

    3. 自动装配

    Spring提供了自动装配的功能,简化了我们的配置,自动装配默认是不打开的,常用的方式有两种:

    • byName:通过参数名自动装配,如下所示,id为userService的的autowire被设置为byName后,IOC容器会通过名字来自动装配,发现UserService类中有个叫userDao的属性,然后看看IOC容器中有没有id为userDao的,如果有就装配进去。
    <bean id="userDao" class="com.example.UserDao">bean>
    <bean id="userService" class="com.example.UserService" autowire="byName"/>
    
    • 1
    • 2
    • byType:通过参数类型自动装配,当autowire被设置为byType后,IOC容器会看看里面有没有UserDao类型的,有就装配进去。
    <bean id="userDao" class="com.example.UserDao">bean>
    <bean id="userService" class="com.example.UserService" autowire="byType"/>
    
    • 1
    • 2

    4. 注解

    • @Autowired注解可以实现自动装配,只要在对应的属性上标记该注解,但是@Autowired注解只按照byType注入。
    public class UserController {
    
        @Autowired
        private IUserService userService;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • @Resource注解可以实现自动装配,它有两个重要属性name和type,name属性解析为bean的名字,type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。

    • @Autowired注解和@Resource注解的作用相同,只不过@Autowired按照byType注入,如果@Autowired想使用名称可以结合@Qualifier注解进行使用

  • 相关阅读:
    docker安装kafka并配置kafka可视化界面
    吃透Chisel语言.38.Chisel实战之以FIFO为例(三)——几种FIFO的变体的Chisel实现
    Vue---SCSS
    ThinPlateSpline(TPS)理论和代码
    信息学奥赛一本通:1175:除以13
    Redis数据类型-Hash-存储结构之dictht字典
    短信验证码实现(阿里云)
    CANoe制作网关实现CAN(FD)报文故障注入(报文长度/timeout/信号错误/E2E)1
    JavaScript-Map和Set集合、iterator、函数的定义和参数获取
    短链系统设计-服务设计
  • 原文地址:https://blog.csdn.net/u011397981/article/details/132751799