Spring IOC注入方式

一、Spring IOC注入分类

1、手动注入

  • set方法
  • 构造器
  • 扩展方式注入
  • 静态工厂
  • 实例化工厂

2、自动注入

  • @Resource注解
  • @AutoWired注解

二、Spring IOC注入详解

1、手动注入

Spring IOC手动注入分为四类,其中第1种set方法注入和第2种构造器注入的方法在我们的日常编程中比较常用.大家可以重点关注一下.
本次通过service层调用dao层的方法来展示
UserDao.class

public class UserDao {
    public void test(){
        System.out.println("dao....");
    }
}
  1. set方法
public class UserService {
    // 业务对象UserDao set注入(提供set方法)
    private UserDao userDao;
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }
    public void test(){
        userDao.test();
    }
 }
 .xml
     <bean id="userDao" class="com.shsxt.dao.UserDao"/>
     <bean id="userService" class="com.shsxt.service.UserService">
        <!--业务对象 注入-->
        <property name="userDao" ref="userDao"/>
     <bean>
  1. 构造器
public class UserService {
    private UserDao userDao;
    public UserService(UserDao userDao02) {
        this.userDao = userDao;
    }
 }
 .xml
 	 <bean id="userDao" class="com.shsxt.dao.UserDao"/>
     <bean id="userService" class="com.shsxt.service.UserService">
        <constructor-arg name="userDao" ref="userDao"></constructor-arg>
     <bean>

扩展方式注入
我们可以使用p命名空间和c命名空间进行注入
p命名空间无参构造函数、c命名空间有参构造函数

public class UserService {
    private UserDao userDao;
    public UserService() {}
    public UserService(UserDao userDao02) {
        this.userDao = userDao;
    }
 }

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:c="http://www.springframework.org/schema/c"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean name="p-userService" class="com.shsxt.service.UserService"
        p:userDao="userDao"/>
    <bean name="p-userService" class="com.shsxt.service.UserService"
        c:userDao="userDao"/>
</beans>
  1. 静态工厂
定义工厂类
public class StaticFactory {
    // 定义静态方法
    public static TeacherService createTeacherService() {
        return new TeacherService();
    }
}
.xml
<!--静态工厂注入-->
   <bean id="teacherService" class="com.shsxt.factory.StaticFactory" factory-method="createTeacherService"></bean>
  1. 实例化工厂
定义工厂类
public class InstanceFactory {
    public TeacherService createService() {
        return new TeacherService();
    }
}
.xml
 <!--实例化工厂注入-->
<bean id="instanceFactory" class="com.shsxt.factory.InstanceFactory"></bean>
<bean id="teacherService" factory-bean="instanceFactory" factory-method="createService"></bean>

2、自动注入

准备工作 配置环境xx.xml

<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
       https://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd">
       
	   <!--开启自动化装配(注入)-->
	   <context:annotation-config/>

@Resource注解

private UserDao ud;
@Resource
public void setUd(UserDao ud) {
    this.ud = ud;
}

1、默认根据属性字段名称查找对应的bean对象 (属性字段的名称与bean标签的id属性值相等)
2、如果属性字段名称未找到,则会通过类型(Class类型)查找
3、属性可以提供set方法,也可以不提供set方法
4、注解可以声明在属性级别 或 set方法级别
5、@Resource可以设置name属性,name属性值必须与bean的id属性值一致;如果设置了name属性值,就只会按照name属性值查找bean对象
6、当注入接口时,如果接口只有一个实现则正常实例化;如果接口存在多个实现,则需要使用name属性指定需要被实例化的bean对象

@Autowired注解

@Autowired
@Qualifier(value = "accountDao")
private AccountDao accountDao;

public void setAccountDao(AccountDao accountDao) {
    this.accountDao = accountDao;
}

1、默认通过类型(Class类型)查找bean对象 与属性字段的名称无关
2、属性可以提供set方法,也可以不提供set方法
3、注解可以声明在属性级别 或 set方法级别
4、可以添加@Qualifier结合使用,通过value属性值查找beam对象(value属性值必须要设置,且值要与bwan标签的id属性值对应)


版权声明:本文为peipei696原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。