曾经java和xml是密不可分的,跨平台的java和跨平台的xml配合的天衣无缝,然而spring中零配置的出现,使用annotation替代xml的配置方式也逐渐开始使用,人们抛弃了xml的配置方式。

首要问题是spring需要自动搜索java下的类,并将这些类注册成bean实例。此处使用annotation进行标注。

1. 基本Bean类搜索

项目

价格

@component

标注普通的spring bean类

@controller

标注一个控制器组件类

@service

标注一个业务逻辑组件类

@repository

标注一个dao组件类

注:@component需要定义一个普通改的bean类,而其他三个标注的类作为特殊的java EE组件,可与工具进行更好的接触,或者与切面进行关联。这三个在以后的发展中可能会赋予更多的语义,因此在标注时尽量根据类的功能标注这三个标签。

采用annotation方法来进行对象注入,需要在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">
    <!-- 自动扫描所有及其包下所有的Bean类 -->
    <context:component-scan base-package="testSpring"/>
</beans>

可以看出xml中配置中使用了component-scan…进行配置,此外include-filter,exclude-filter等过滤器也可以进行过滤扫描等功能。

@Component   //方法1:该接口放在了testSpring下,作为加载类型进行标记
public interface Axe {
    public String chop();
}

@Component("axe") //方法2:也可以采用该方法进行标记。

实例名称默认为类名的第一个字母变成小写,其他不变。也可以采用上面方法进行标记定义实例名。

public class BeanTest {

    public static void main(String[] args){
    ApplicationContext ctx= new                 ClassPathXmlApplicationContext("beans.xml");
    System.out.println("-----"+java.util.Arrays.toString(ctx.getBeanDefinitionNames()));
    }
}

2.设置Bean的作用域

可以通过scope来制定Bean实例的作用域,没有指定scope属性的作用域默认是singleton

如下例:

@Component
@Scope("prototype")
public class Chinese {
}

也可以采用通过xml文件中的方式进行配置。

<?xml version="1.0" encoding="UTF-8"?>
<beans ...>
...
    <context:component-scan base-package="testSpring"
     scope-resolver="org.crazyit.app.util.MyscopeResolver"/>
</beans>

3.使用@Resource配置依赖
@resource位于java.annotation包下,是来自javaEE规范的一个Annotation。改annotation中有name属性,来指定加载的实例。它不仅可以修饰setter方法,也可以直接修饰field,也可以省略name属性。
若省略name属性,当修饰field时,根据类型匹配,当修饰setter时,则默认去掉setter前面的set后,将第一个字母小写。即setAxe,实例名为axe。

@Component
@Scope("prototype")
public class Chinese {

    @Resource(name="steelAxe")//修饰field
    private Axe axe;

    //@Resource(name="steelAxe") 修饰set方法
    public void setAxe(Axe axe) {
        this.axe = axe;
    }


3.使用@postConstruct和@PreDestroy定制生命周期行为

init-method 指定初始化方法,发生在依赖注入完成后 destroy-method 指定销毁之前的方法,发生在容器销毁Bean之前

spring正常在xml中有配置生命周期前后的功能行为。Annotation也配置了@postContruct和@PreDestroy使用。

例:

@Component
@Scope("prototype")
public class Chinese {

    @Resource(name="steelAxe")
    private Axe axe;

    @Resource(name="steelAxe")
    public void setAxe(Axe axe) {
        this.axe = axe;
    }

    @PostConstruct  //发生在依赖注入之后
    public void init(){

    }

    @PreDestroy  //发生在bean销毁之前
    public void destroy(){

    }
}

4.Spring3.0新增的Annotation
@DependOn :加载该对象之前先加载哪些类
如:@DependOn({“steel”,”abc”})
@Lazy: 使bean延迟加载
如:@Lazy(true)

5.自动装配和精确装配

@Autowired,他可以标注setter方法、普通方法、Field和构造器。

@Autowired
    public void setAxe(Axe axe) {
        this.axe = axe;
    }

@Autowired默认是byType方式装配,若修饰setter时,采用去挑set后第一个字母小写的方式作为实例名。此外,@Autowired也可以修饰多个参数的普通方法。以及构造器和Field。还可以修饰对象数组和泛型等等。

@Qualifier通常可用于修饰Field。他目标精确的指定装配的实例。此外,他还可以修饰形参。如下例子所示:

public class Chinese {

    @Qualifier("steelAxe")
    private Axe axe;

    public void setAxe(@Qualifier("steelAxe") Axe axe) {
        this.axe = axe;
    }
}

以上就是Annotation的基本使用,要熟练掌握,还需要更加了解spring的相关知识。