继续上一篇
接着总结Spring注解,详细说明注解配置xml文件和spring有哪些注解,每个注解是做什么用的.
使用注解来构造Ioc容器
用注解来向Spring容器注册Bean,需要在applicationContext.xml中注册
例如:在base-package指明一个包
<context:component-scan base-package="cn.gacl.java">
表明cn.gacl.java包以及其子包中,如果某个类的头上带有特定的注解[@Component,@Repository,@Service,@Controller],就会将这个对象作为Bean注册进Spring容器。
也可以在中指定多个包,多个包用逗号隔开。如:
<contex:component-scan base-package="cn.gacl.dao.impl,cn.gacl.service.impl,cn.gacl.action">
详细介绍各个注解的含义
1. @Component
@Component是所有受Spring管理组建的通用形式,该注解可以放在各个类的头上,但是不推荐使用@Component注解
2. @Controller
@Controller对应表现层的Bean,也就是Action例如:
@Controller
@Scope("prototype")
public class UserAction extends BaseAction<User>{
}
使用@Controller注解标识UserAction之后,就标识要把UserAction交给Spring容器管理,在Spring容器中会存在一个名字为userAction的action,这个名字是根据UserAction类名来取的。
注意:如果@Controller不指定其value,则默认的bean名字为这个类的类名,并且首字母小写。如果指定value,比如是 @Controller(“value=UserAction”)或者写成@Controller(“UserAction”) 那么就使用value作为bean的名字。
这里的类UserAction还使用了@Scope(“prototype”)注解,表示将这个Action范围声明为原型。意思是可以利用容器的scope=”prototype”来保证每一个请求都有一个单独的Action来处理,避免Struts中的Action的线程不安全问题。
spring默认scope是单例模式,即@Scope(“singleton”),这样只会创建一个Action对象,每次访问都是同一Action对象,数据不安全,Struts2是要求每次访问都对应不同的Action,使用@Scope(“prototype”)可以保证当有请求的时候都创建一个Action对象。
3. @Service
@Service对应的是业务层的Bean
@Service("userService")
public class UserServiceImpl implements UserService{
}
@Service(“userService”)注解是告诉Spring,当Spring要创建UserServiceImpl的实例时,bean的名字必须叫做”userService”,这样当Action需要使用UserServiceImpl的实例时,就可以由Spring创建好的”userService”。然后注入给Action。在Action中只需要声明一个名字叫”userService”的变量来接收由Spring注入的”UserService”即可,具体代码如下:
//注入UserService
@Resource(name="userService")
private UserService userService;
注意:在Action声明的”UserService”变量类型必须是”UserServiceImpl”或者是其父类”UserService”,否则由于类型不一致而无法注入。
由于Action中声明的userService变量使用了@Resource注解去标注,并且指明了其name=”userService”,这就等于告诉Spring,说我Action需要实例化一个”userService”,你Spring快点帮我实例化好,然后给我。
当Spring看到userService变量上的@Resource注解时,根据其指明的name属性就可以知道(知道bean id 找到对应的实现类),Action中需要用到一个UserServiceImpl的实例,此时Spring就会把自己创建好的名字叫做”userService”的UserServiceImpl实例注入给Action中的”userService”变量,帮助Action完成userService的实例化。
这样在Action中就不用通过
UserService userService=new UserServiceImpl();
这种最原始的方式去实例化userService了。如果没有Spring,那么当Action需要使用UserServiceImpl时,必须通过new这种方式主动实例化对象,但使用Spring之后,创建UserServiceImpl实例对象的工作交给Spring来做了,Spring能够把创建好的UserServiceImpl实例给Action,Action拿到就可以直接用。Action由原来的主动创建UserServiceImpl实例,变成了被动等待由Spring创建好UserServiceImpl实例后再注入给Action,Action才能够使用。这说明Action对”UserServiceImpl类的“控制权”已经被“反转”了(原来主动权在自己收上,自己要使用UserServiceImpl类的实例,自己主动去new一个出来马上就可以使用,但现在自己不能主动去new类的实例,new实例的权利已经被Spring拿走了,只有Spring才能个new类的实例,而Action只能等Spring创建好类的实例后,再把实例注入给Action,这样Action才能使用这个这个类的实例,这就是Spring核心思想“控制反转”,也叫“依赖注入”)
4. Repository
@Repository对应数据放问层Bean,例如
@Repository(value="userDao")
public class UserDaoImpl extends BaseDaoImpl<User>{
}
@Repository(value=”userDao”)注解是告诉Spring,让Spring创建一个名字叫”userDao”的UserDaoImpl实例。
当Service需要使用UserDaoImpl的时候,就可以使用@Resource(name=”UserDao”)注解告诉Spring,Spring把创建好的userDao注入给Service即可。
//注入userDao
@Resource(name="userDao")
private BaseDao<User> userDao;
Spring常用注解汇总
本文汇总一下Spring的常用注解,以方便大家查询和使用,具体如下:
使用注解之前要开启知道扫描包功能
<context:component-scan base-package="cn.test">
@Configuration:把一个类作为一个Ioc容器,它的某个方法头上如果注册了Bean,就会作为这个Spring容器中的Bean
@Lazy(true):表示延迟初始化
@Service:用于标注业务层组件
@Controller:用于标注控制层组件,如Struts中的action
@Repository:用于标注数据访问层组件,即DAO
@Component:泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注
@Scope:作用域。用在类上
@PostConstruct用于指定初始化方法。用在方法上
@PreDestory用于指定销毁方法。用在方法上
@DependsOn:定义Bean初始化及销毁时的顺序
@Primary:自动装配时当出现多个Bean候选者时,被注解为@Primary的Bean将作为首选者,否则将抛出异常
@Autowired:默认按类型装配,如果我们想使用按名称装配,可以结合@Qualifier注解一起使用。如:用在方法上
@Autowired
@Qualifier("personDaoBean")
@Resource:默认按名称装配。推荐使用。用在方法上
@PostConstruct 初始化注解
@PreDestroy 摧毁注解 默认 单例 启动就加载
@Async异步方法调用