四大注入方式:setter注入、构造器注入、工厂注入,注解注入。
一、setter方法注入:利用类的Setter方法将组件注入,以下例子就是利用public void setUserDao(UserDao userDao){this.userDao = userDao;} 注入,直接上代码。
public class UserDao { } public class UserServcie { private UserDao userDao; public void setUserDao(UserDao userDao){ this.userDao = userDao; } }
配置文件
<!--userDao--> <bean id="userDao" class="com.beans.UserDao"></bean> <!--userService--> <bean id="userService" class="com.beans.UserServcie"> <property name="userDao" ref="userDao"></property> </bean>
二、构造器注入:利用类的构造器将组建注入 public UserServcie(UserDao userDao){}。
这里注意:spring 容器对构造函数配置Bean 进行实例化的时候,有一个前提,即 Bean 构造函数入参引用的对象必须已经准备就绪。也就是说如果使用构造器注入,注入的参数必须是已经被创建好的对象。
public class UserServcie { private UserDao userDao; public UserServcie(UserDao userDao){} }
配置文件
<!--userDao--> <bean id="userDao" class="com.beans.UserDao"></bean> <bean id="userService" class="com.beans.UserServcie"> <constructor-arg name="userDao" ref="userDao"></constructor-arg> </bean>
三、工厂方法注入(实例工厂和静态工厂),简单理解就是利用工厂方法对组件进行注入。
1.、实例工厂注入:在配置文件中通过factory-bean配置生产依赖bean工厂,factory-mothod配置工厂生产依赖bean的方法。在工厂方法中将UserService装配。
工厂类
public class UserServiceFactory { public UserServcie getUserDao(){ UserServcie userServcie = new UserServcie(); userServcie.setUserDao(new UserDao()); return userServcie; } }
配置文件
<bean id="userServiceFactory" class="com.beans.UserServiceFactory"> </bean><bean id="userService" factory-bean="userServiceFactory" factory-method="getUserDao"> </bean>
2、静态工厂方法注入
工厂类
public class UserServiceFactory { public static UserServcie getUserDao(){ UserServcie userServcie = new UserServcie(); userServcie.setUserDao(new UserDao()); return userServcie; } }
<bean id="userServiceFactory" class="com.beans.UserServiceFactory"></bean><bean id="userService" class="com.beans.UserServiceFactory" factory-method="getUserDao"></bean>
四、注解方式注入
注解方式注入又分为@Autowired 和 @Resource 。
@Autowired注解是spring的注解,默认是按照类型注入,当发现有多个类型时会报异常:
Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'com.beans.xxxx' available: expected single matching bean but found 2
使用 @Autowired但是存在着多个实例时,可以配合 @Qualifier(value = "实例的名字"),此时将会按照名字注入。
@Autowired使用时可以选择是否必须注入,@Autowired(required = false) 时,允许bean不注入,如果找不到需要注入的bean也不会报异常,默认缺省时是必须注入。看一下注解内部默认true。
public @interface Autowired { boolean required() default true; }
@Resource 是java中的注解,默认是按照name注入,当name注入不成功时,将会按照type注入。当@Resource(name=" ")指定了name时,如果找不到改name的实例,将会注入失败。