注解的配置
beans.xml增加4句配置。
<?xml version="1.0" encoding="UTF-8"?>
<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
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<context:annotation-config />
</beans>
xmlns:context="http://www.springframework.org/schema/context"
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
<context:annotation-config />
,注解的配置,后面用<context:component-scan base-package="com.shen" />
代替!
@Autowired和@Qualifier
@Autowired
配置了该注解,IOC容器会自动
帮你注入形参类型的bean实体
(代替bean标签下的子标签property)。
属性required:声明是否需要注释的依赖关系。默认是true(需要),不需要则不帮你注入(没啥用),适用场景:不确定IOC容器中是否存在形参类型的bean,配置为false,IOC初始化时不会报错,因为不是必须注入的。
注解使用地点:可以加在容器、成员变量(不推荐,破坏封装)、set(任意)方法(推荐)。
@Qualifier
@Autowired是根据byType
来找bean实体的。所以使用@Qualifier(byName
)来确定某个相同类型的bean的id
。
beans.xml代码如下:
<bean id="u" class="com.shen.dao.impl.UserDAOImpl">
</bean>
<bean id="u2" class="com.shen.dao.impl.UserDAOImpl">
</bean>
JAVA代码如下:
@Autowired
public void setUserDAO(@Qualifier("u") UserDAO userDAO) {
this.userDAO = userDAO;
}
注:为了容错匹配,bean的id/name是默认的Qualifier的值。
若没有写bean的id/name值,则需要如下xml配置:
<bean class="com.shen.dao.impl.UserDAOImpl">
<qualifier value="u"></qualifier>
</bean>
@Required
在容器初始化时,必须自动注入该方法参数的bean,若未找到需要的bean,则报错。
@Resource(推荐使用)
注解位置:同@Autowired
默认根据byName
(默认bean id是set方法后面的字符,首字符小写),按name/id找不到,在按照byType
,在beans.xml中查找bean。
代码如下:
@Resource
public void setUserDAO(UserDAO userDAO) {
this.userDAO = userDAO;
}
如果想直接用byName
查找,则使用@Resource(name="XXX")
。
Auto-detecting components
自动扫描组件,配置文件里不需要bean标签了。直接在bean类中注解。
@Component(通用组件)
先配置beans.xml。在beans标签下增加子标签
<context:component-scan base-package="com.shen" />
,让容器自动扫描包“com.shen”下的所有JAVA文件。
PS:所有的bean都可以使用@Component注册为组件。@Component声明该类为一个“组件”,当容器发现有该注解时,认定他是一个bean(Resource),默认的Key(名字)是他的类名首字母小写。
其他类可使用@Resource(name=”上面的Key(名字)”)来进行自动注入 。(当然也可以使用@Autowired(byType)和@Qualifier(byName))
UserDAOImpl.java
@Component("u")
public class UserDAOImpl implements UserDAO {
………………
}
UserService.java
@Resource(name="u")
public void setUserDAO(UserDAO userDAO) {
this.userDAO = userDAO;
}
其他组件
@Service用于标注业务层组件
@Controller用于标注控制层组件(如struts中的action)
@Repository用于标注数据访问组件,即DAO组件
@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注
@Scope
@Scope(“XXX”)
同XML中的配置。
- singleton:不管取多少次bean对象,都是同一个。
- prototype:每次创建新的对象,可以拿到多个bean,不是同一个。
@PreDestory@PostConstruct
实例对象销毁前执行和初始化之后执行,标记在方法上面。