Spring之注解

来源:互联网 发布:js display 显示 编辑:程序博客网 时间:2024/06/05 09:36
Spring组件自动扫描
Spring将所有的bean都纳入IOC中创建、管理和维护。
一个系统往往有成千上万个组件,如果需要手动将所有组件都纳入Spring容器中管理,是一个浩大的工程
在Spring2.5中引入了组件自动扫描机制(component scanning) ,
它能够从classpath里自动扫描、侦测和实例化具有特定注解的组件
大大减少了程序员在配置XML文件上的时间,使得配置文件显得干净,整洁,便于维护
但是个人觉得缺点:违反了解耦的思想


使用步骤:
第一步:导入jar包
commons-collections4-4.0.jar
commons-dbcp2-2.1.1.jar
commons-logging-1.2.jar
commons-pool2-2.4.2.jar
mysql-connector-java-5.1.26-bin.jar
spring-beans-3.2.8.RELEASE.jar
spring-context-3.2.8.RELEASE.jar
spring-core-3.2.8.RELEASE.jar
spring-expression-3.2.8.RELEASE.jar
spring-jdbc-3.2.8.RELEASE.jar
spring-tx-3.2.8.RELEASE.jar

第二步:配置需要扫描的类
创建配置Spring的主配置文件 applicationContext-annotation.xml 配置如下:
<!-- 开启Spring IOC 容器的注解支持 -->
<context:annotation-config></context:annotation-config>
<!-- 定义组件扫描的包路径 -->
<context:component-scan base-package="com.spring.annotat ion"></context:component-scan>


第三步:为被扫描的类添加注解
业务逻辑层(action/controller)
@Controller //标识该类为控制器组件(就是IOC容器中的一个bean而已)
public class UserAction {
@Autowired //默认根据当前属性名称从IOC容器中查找相应的类实例(组件)
private UserService userService ;

服务层(service)
@Service("userService") //标识当前类为IOC容器中的组件或者bean实例(服务层组件)
public class UserServiceImpl implements UserService {
@Autowired  //默认根据当前属性名称从IOC容器中查找相应的类实例(组件)
private UserDAO userDAO ;

DAO层(Repository)
@Repository("userDAO")
public class UserDAOImpl implements UserDAO {


@Component  是泛指组件注解
@Component(value="userService2")  //通过该注解同样可以实现 IOC容器管理该类的实例的功能
//当我们有一些类不适合使用@Controller @Service @Repository 时候,可以使用该注解
public class UserService2Impl implements UserService {


@Autowired  和 @Resource
都可以对成员变量、方法和构造器进行标注,来完成自动装配的工作

@Autowired //默认根据当前属性类型从IOC容器中查找相应的类实例(组件)
private UserService userService ;
@Resource  //默认根据当前属性名称从IOC容器中查找相应的类实例 (这是推荐使用的 效率应该更高一点)
private UserDAO userDAO ;



@Autowired  //默认采用类型匹配找Bean  byType
@Qualifier("userService3Impl") //修改上面的@Autowired 为 采用byName找Bean
private UserService us3 ;


等价于
@Autowired
public void setUs3(@Qualifier("userService3Impl") UserService us3) {
this.us3 = us3;
}


@PostConstruct  //该注解是标识该方法在构造器之后执行
public void afterInit(){
System.out.println("TestInitBean afterInit is running .... ");
}
@PreDestroy  //标识该方法在当前Bean销毁之前进行调用
public void beforeDestroy(){
System.out.println("TestInitBean beforeDestroy is running .... ");
}
ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("com/spring/annotation/applicationContext-annotation.xml");
TestInitBean tib = (TestInitBean) ac.getBean("testInitBean");
tib.show();
ac.close();






@Scope
简单的说,就是对象在spring容器(IOC)中的生命周期,也可以理解为对象在spring容器中的创建方式


目前,Scope取值有5中
1--singleton(单一实例)
2--prototype(原型 多个实例)
3--request (该对象只存在于HTTP请求中,该请求结束之后就销毁了)
4--session(将当前实例存放在当前用户的会话中)
5--global session (Application)











---------------------------------------------------


特别解释:


// @Resource   //javax.annotation.Resource
/*
* 默认按照属性名称匹配,没有找到就自动再按照类型匹配,如果找到多个同类型bean,那么就会抛出UNuniqueException

* 装配顺序:
* 1--如果同时指定了name的type,则从spring上下文中找到唯一匹配的进行装配,找不到抛出异常
* 2--如果制定了name属性,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
* 3--如果制定了type属性,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常
* 4--如果既没有制定name,也没有制定type,则自动按照byName方式进行装配,如果没有匹配,
* 则回退为一个原始类型进行匹配,如果匹配就自动装配
*/
@Autowired(required=false)
/*
* 1--默认按照类型装配,如果找到多个同类型的bean就抛出异常 bean不唯一异常
* 2--如果需要按照名称匹配,可以和@Qualifier("beanName")一起使用
* 3--如果允许null值,可以为@Autowired添加属性 required=false  表示为允许为空
*/
@Qualifier("ti8") //如果添加了 该注解  按照该注解的名称和bean的名称相匹配,而不是属性的名称了
private TI ti8 ;





















0 0