写在前面
abstract bean:如果它的abstract设置为true,它通常作为模板或者父类,不能实例化,记住要将它的abstract设置为true,否则,上下文会试着实例化该bean
spring3.0为我们提供了组件自动扫描机制,他可以在类的路径下寻找@Component,@Service,@Controller,@Repository注解的类,并把他们纳入spring容器管理
其中@Service标注业务层组件,@Controller标注控制层组件,如spring mvc的controller,struts2的action,@Repository标注数据访问组件,即Dao组件,而@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解来标注组件。
首先需要加入对注解的支持
<!-- 加入对注解的支持 -->
<context:annotation-config/>
<!-- 扫描它下面的所有子包 -->
<context:component-scan base-package="com.qzp"/>
下面来介绍下常用的注解:
@Component(value="person")它的效果等同于applicationContext中的<bean name=" " class=" ">
如果发生了冲突,后者会覆盖前者。
@Resource(name="user")它的效果等同于applicationContext中的<prototype> 建议写在setter方法上面
bean的生存范围
@Scope(value="singleton")
bean的生命周期
@PostConstruct
@PreDestroy
他们写在初始化方法和销毁方法之上。
注解的完整实例
事例代码:
//bean的生存范围
@Scope(value="singleton")
@Component(value="user")
public class User{
private String userName;
private String password;
public User() {
super();
System.out.println("User的构造方法....");
}
@PostConstruct
public void init() {
System.out.println("User的初始化方法...");
}
@PreDestroy
public void destroy() {
System.out.println("User的销毁方法...");
System.out.println("--------------");
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
userService类
@Component(value="userService")
public class UserService {
private User u;
public User getU() {
return u;
}
//依赖于user这个@Component
@Resource(name="user")
public void setU(User u) {
this.u = u;
}
public boolean saveUser(){
if(u!=null){
System.out.println("用户名是:"+u.getUserName());
return true;
}
else{
return false;
}
}
}
配置文件 applicationContext.xml
<?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-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
">
<!-- 加入对注解的支持 -->
<context:annotation-config/>
<!-- 扫描它下面的所有子包 -->
<context:component-scan base-package="com.qzp"/>
</beans>
最后是测试文件
public class TestAnnotation{
public static void main(String[] args) {
AbstractApplicationContext cxt=new ClassPathXmlApplicationContext("applicationContext.xml");
cxt.getBean("user");
UserService u=(UserService)cxt.getBean("userService");
u.saveUser();
cxt.close();
}
}
测试结果:
User的构造方法....
User的初始化方法...
用户名是:null
User的销毁方法...
--------------