@Autowired 注释
2018-11-29 10:23 Echo. 阅读(381) 评论(0) 收藏 举报基本用法: 作用于构造器、方法、参数、属性
@Autowired 注释,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。 通过 @Autowired的使用来消除 set ,get方法。在使用@Autowired之前,我们对一个bean配置起属性时,是这样用的
<property name="属性名" value=" 属性值"/>
原理:那么使用@Autowired的原理是什么?
其实在启动spring IoC时,容器自动装载了一个AutowiredAnnotationBeanPostProcessor后置处理器,当容器扫描到@Autowied、@Resource或@Inject时,就会在IoC容器自动查找需要的bean,并装配给该对象的属性
<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>
注意事项:
在使用@Autowired时,首先在容器中使用byType查询对应类型的bean, 如果查询结果刚好为一个,就将该bean装配给@Autowired指定的数据, 如果查询的结果不止一个,那么@Autowired会通过ByName名称来查找。如果查询的结果为空,那么会抛出异常。解决方法:使用@Autowired(required = false)
有2个或2个以上的类实现了同一个接口, 那么在使用注入接口实现类的时候需要同时使用@Autowired,@Qualifier注解, 用来指定注入特定的bean。
案例演示:
UserRepository 接口定义了一个save方法
package com.company.repository; public interface UserRepository { void save(); }
再定义一个UserRepository接口的实现类UserRepositoryImpl 实现了save方法
package com.company.repository; import org.springframework.stereotype.Repository; // 定义该bean id为 userRepository @Repository("userRepository") public class UserRepositoryImpl implements UserRepository { @Override public void save() { System.out.println("UserRepositoryImpl save"); } }
定义一个业务逻辑组件UserService, 加入一个UserRepository类型的成员变量, 使用@Autowired注解自动从Ioc容器去查找bean
package com.company.service; import com.company.repository.UserRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; @Service("userService") public class UserService { @Autowired private UserRepository userRepository; public void save(){ userRepository.save(); } }
这段代码输出 UserRepositoryImpl save
ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml"); UserService userService = (UserService)context.getBean("userService"); userService.save()
再定义一个UserRepository接口的实现类UserJdbcImpl实现了save方法
package com.company.repository; import org.springframework.stereotype.Repository; @Repository("userJdbc") public class UserJdbcImpl implements UserRepository { @Override public void save() { System.out.println("UserJdbcImpl save"); } }
修改UserService
package com.company.service; import com.company.repository.UserRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; @Service("userService") public class UserService { /* * 会实例化 @Repository("userJdbc") 注解的类 * */ @Autowired private UserRepository userJdbc; /* * 会实例化 @Repository("userRepository") 注解的类 * */ @Autowired private UserRepository userRepository; /* * @Qualifier 用来指定需要装载的bean的名称 * */ @Autowired @Qualifier("userRepository") private UserRepository myUserRepository; public void save() { userJdbc.save(); //输出 UserJdbcImpl save } public void save1(){ userRepository.save(); //输出 UserRepositoryImpl save } public void save2(){ myUserRepository.save(); //输出 UserRepositoryImpl save } }
浙公网安备 33010602011771号