文章1:详解依赖注入与自动装配
文章2:详解 Spring 3.0 基于 Annotation 的依赖注入实现
观点: 注入与装配是不同的两个过程.
( 注入 = 实例化 + 装配 )
一. 实例化:(有4种方式 构造器实例化,静态工厂实例化,实例工厂实例化,注解自动实例化)
(1) 实例化的是bean实体类. 笨重的方法就是用bean节点在xml中来注入咯,而精简的方式便是注解咯.
(下面就是注解的方式,注解后,在xml中扫描即可).
- @Repository (标识dao-Impl),
- @Service (标识service),
- @Controller (标识servlet或叫controller或action)
- @Component (标识model) <作用不明确,定义bean,当不好归类时,可用此注解>
- (注:自动扫描默认命名为类名首字母小写; 若带有name属性(例: @Controller(name="userAdd")),将使用该指定名).
(2) 那么为了把这么些个实体类扔进Ioc容器中 (这里要说,所谓的自动化智能都是假的,皆需人为),怎么整?
通过注解已经做好标记,便只需在applicationContext.xml中配个注解来主动扫描查找咯
<!-- 要先引入这个配置 -->
....
http://www.springframework.org/schema/context/spring-context-4.2.xsd
...
<beans ... >
....
<context:component-scan base-package="com.study.niubai">
<!-- 根包名(可多个用','隔开),默认将扫描其下及其子包的这些注解 -->
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
<!-- 标识要扫面的注解.(若自动扫描未关闭,此节点无用) -->
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
<!-- 标识不扫描的注解 -->
</context:component-scan>
....
</beans>
二. 装配:(有3种方式 set装配,构造装配,注解自动装配)
(3) 既已注入实体类,必然就需要装配各种属性,方法啥的. 怎么装配呢?
这就用到常讲的set注入,构造注入,工厂注入.实则就是装配的不同罢了.也有注解自动装配.
(下面用的注解自动装配)
- @Autowired有五种模式 默认按类型匹配. 可写在成员属性或set()方法上.
属性:(required="true") //一定要找到对应的bean,否则抛异常;默认值true.
- @Qualifier("bean的名字") //与@Autowired连用. 解决按类型多匹配的异常问题.
例: @Autowired
@Qualifier("bean的名字")
- @Resource //默认按名称匹配. 当找不到名称时,再按类型匹配. JSR-330提供. 可写在成员属性或set()方法上.
属性:(name="注入的名称"). //若无name,则默认使用变量名;一般不写.
(注:按@Resource(name="beanName")注入,若无匹配bean,则不再按类型装配.)
- @Inject //(不用). 按类型装配. 功能比@Autowired少. JSR-330提供.
作用域:
(有5种 看推文1,不赘述)
对于bean,在上面已经注入,也装配好了. 那么它该用在那里?
@Scope("prototype") //默认为singleton.
其他的注解也在此学习一下:
@PostConstruct //等价init-method. bean初始化时执行. 使用在方法上.
@PreDestroy //等价destroy-method. bean销毁时执行. 使用在方法上.