Spring实例解析之Annotation

来源:互联网 发布:linux查找指定文件 编辑:程序博客网 时间:2024/06/05 05:06

@(Spring)
*本文主要参考Spring in action(第三版),并以自己的实例进行了实现。

上一篇Spring实例解析之XML装配Bean简单介绍了Spring使用xml来装配Bean,这一篇将会继续使用同样的实例来简单介绍Spring的annotation来简化xml的配置。

1.maven依赖

    <dependencies>        <dependency>            <groupId>junit</groupId>            <artifactId>junit</artifactId>            <version>4.12</version>        </dependency>        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-context</artifactId>            <version>4.3.8.RELEASE</version>        </dependency>        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-test</artifactId>            <version>4.3.2.RELEASE</version>        </dependency>    </dependencies>

2.Spring-autowiring(自动装配)

Spring有多种方式来处理Bean的依赖关系。这里会给出四种自动装配策略:byName,byType,constructor,autodetect。

2.1接口介绍

本文将围绕People接口,来渐渐展开。

public interface People {    void doWorking();}

2.2声明简单Bean

Himma(搬砖工)实现People接口。并有两个参数,birckNum(砖头数),pitNum(填坑数)。

package com.spring;public class Himma implements People {    //默认一天搬100块砖    private Integer brickNum = 100;    //默认填5个坑    private Integer pitNum = 5;    public Himma(){    }    public Himma(int brickNum){        this.brickNum = brickNum;    }    public Himma(int brickNum, int pitNum){        this.brickNum = brickNum;        this.pitNum= pitNum;    }    public void doWorking() {        System.out.println("今天搬了"+brickNum+"块砖,还填了"+pitNum+"个坑");    }    public void setBrickNum(Integer brickNum) {        this.brickNum = brickNum;    }    public void setPitNum(Integer pitNum) {        this.pitNum = pitNum;    }}

增添新的类SingHimma。里面增加了一个Song的引用,在其搬砖的时候还能唱首歌。

public class SingHimma extends Himma{    private Song song;    public SingHimma(){    }    public SingHimma(Song song){        this.song = song;    }    public SingHimma(int brickNum,Song song){        super(brickNum);        this.song = song;    }    @Override    public void doWorking() {        // TODO Auto-generated method stub        super.doWorking();        System.out.println("开始唱歌。。");        song.sing();    }    public void setSong(Song song) {        this.song = song;    }}

2.3创建Spring的autowiring的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"   xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans-2.5.xsd" >    <!-- 可以在beans标签内部增加default-autowire属性,应用于本Spring配置文件中的所有Bean,这里不做赘述 -->    <!-- byName自动装配 ,通过setter注入-->    <!-- 把与Bean的属性具有相同名字(或者ID)的其他Bean自动装配到Bean的对应属性中。-->    <!-- 如果没有跟属性的名字相匹配的Bean,则该属性不自动装配  -->    <!--     <bean id="xiaoXia" class="com.spring.autowiring.SingHimma" autowire="byName"></bean>    <bean id="song" class="com.spring.autowiring.FadedSong"></bean>     -->    <!-- byType自动装配 ,通过setter注入-->    <!-- 把与Bean的属性具有相同类型的其他Bean自动装配到Bean的对应属性中。 -->    <!-- 如果没有跟属性的类型相匹配的Bean,则该属性不被装配 -->    <!-- 如果有多个同属性的Bean满足条件则会抛出异常-->    <!-- 可以通过primary设置为true使其标识成首选-->    <!-- 在Spring in action 第三版上说因为primary默认为true,所以要设置其他同类型的所有primary为false。但是目前实际测试,并不需要将其他的设置为false-->    <!-- 还可以通过autowire-candidate为false,使其自动装配时忽略该Bean-->    <!--    <bean id="xiaoHong" class="com.spring.autowiring.SingHimma" autowire="byType"></bean>    <bean id="fadedSong" class="com.spring.autowiring.FadedSong" primary="true"></bean>    <bean id="sugerSong" class="com.spring.autowiring.SugerSong" autowire-candidate="false"></bean>    -->    <!--constructor自动装配,通过构造器注入 -->    <!-- 把与Bean的构造器入参具有相同类型的其他Bean自动装配到Bean构造器对应入参中。 -->    <!-- 其局限性与上述byType一致。 -->    <!--    <bean id="xiaoGang" class="com.spring.autowiring.SingHimma" autowire="constructor"></bean>    <bean id="fadedSong" class="com.spring.autowiring.FadedSong"  primary="true"></bean>    <bean id="sugerSong" class="com.spring.autowiring.SugerSong" ></bean>    -->    <!-- autodetect自动装配 -->    <!-- 首先尝试使用constructor进行自动装配。如果失败,再尝试使用byType进行自动装配 -->    <!--    <bean id="xiaoMing" class="com.spring.autowiring.SingHimma" autowire="autodetect"></bean>    <bean id="fadedSong" class="com.spring.autowiring.FadedSong" primary="true"></bean>    <bean id="sugerSong" class="com.spring.autowiring.SugerSong" ></bean>    --></beans>

2.4 初步实现

public class AutowiringTest {    ApplicationContext applicationContext;    @Before    public void setUp() throws Exception {        applicationContext = new ClassPathXmlApplicationContext(                "Spring-autowiring.xml");    }    @Test    public void testxiaoXia() {        People xiaoXia = (People) applicationContext.getBean("xiaoXia");        xiaoXia.doWorking();    }    @Test    public void testxiaoHong() {        People xiaoHong = (People) applicationContext.getBean("xiaoHong");        xiaoHong.doWorking();    }    @Test    public void testxiaoGang() {        People xiaoGang = (People) applicationContext.getBean("xiaoGang");        xiaoGang.doWorking();    }    @Test    public void testxiaoMing() {        People xiaoMing = (People) applicationContext.getBean("xiaoMing");        xiaoMing.doWorking();    }    @After    public void destroy() {        // 关闭容器,演示destory-method        ((ClassPathXmlApplicationContext) applicationContext).close();    }}

3.Spring-annotation

Spring annotation的相关实例将会延续以上的几个类。

3.1 xml配置

Spring配置启动自动扫描功能

    <context:component-scan        base-package="com.spring.annotation">    </context:component-scan>

Spring在容器初始化时自动扫描配置的包下面及其子包下面的所有标注了@Repository、@Component、@Service 和 @Constroller的类,并将其注册成Spring bean。

3.2 标注Bean注解

@Repository注解:用于标注数据访问组件,即DAO组件
@Service注解:用于标注业务层组件
@Controller注解:用于标注控制层组件(如struts中的action)
@Component注解:泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。

目前来看@Repository、@Service、@Controller是@Component的特殊情况,一种更细致的划分。将来可能会对具体所能实现的功能进行更好的扩展。@Repository已经实现能将所标注的类中抛出的数据访问异常封装为 Spring 的数据访问异常类型。

3.3 自动装配注解

Spring中 @Autowired注解与@Resource注解都可以对bean进行装配。
不过@Autowired由Spring提供,@Resource由J2EE提供。
@Autowired只按照byType 注入;@Resource默认按byName自动注入,也提供按照byType 注入。

3.4 初始化和销毁方法

Spring除了在xml中配置init-method与destroy-method外还有两种方法能实现初始化和销毁方法。
一种是实现InitializingBean 和 DisposableBean接口。
一种是在方法上分别标注@PostConstruct与@PreDestroy来实现。

3.5 通过注解的方法读取properties文件

在xml配置中添加

<context:property-placeholder location="classpath*:*.properties" />

txn.properties的内容如下

brickNum=190
pitNum=55

在所注入的字段上方添加@Value注解

    @Value("${brickNum}")    private String brickNum;

3.7 实例

完整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-2.5.xsd    http://www.springframework.org/schema/context    http://www.springframework.org/schema/context/spring-context-3.0.xsd ">    <context:component-scan        base-package="com.spring.annotation">    </context:component-scan>    <context:property-placeholder location="classpath*:*.properties" /></beans>

组件FadedSong

import org.springframework.stereotype.Component;@Component("fadedSong")public class FadedSong implements Song{    public void sing() {        // TODO Auto-generated method stub        System.out.println("You were the shadow to my light....Did you feel us....");    }}

service组件

@Servicepublic class SingHimma extends Himma{    @Resource(name = "fadedSong")    private Song song;    @Value("${brickNum}")    private String brickNum;    public SingHimma() {    }    public SingHimma(Song song) {        this.song = song;    }    @PostConstruct    public void afterPropertiesSet() throws Exception {        // TODO Auto-generated method stub        System.out.println("开始上班了");    }    @PreDestroy    public void destroy() throws Exception {        // TODO Auto-generated method stub        System.out.println("下班了");    }    @Override    public void doWorking() {        // TODO Auto-generated method stub        super.setBrickNum(Integer.parseInt(brickNum));        super.doWorking();        System.out.println("开始唱歌。。");        song.sing();    }    public void setSong(Song song) {        this.song = song;    }}

实例测试

package com.spring.annotation;import javax.annotation.Resource;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.test.context.ContextConfiguration;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import com.spring.annotation.People;@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(locations={"classpath:/Spring-annotation.xml"})public class AnnotationTest {    @Resource    private People people;    @Test    public void testAnnotation(){        people.doWorking();    }}

4.小结

以上为Spring的自动装配Bean与annotation的一个简单例子。附上github的地址:https://github.com/JunliXia/Spring_Annotation

5.参考

Spring in action
http://blog.csdn.net/chjttony/article/details/6286144
http://stackoverflow.com/questions/6827752/
http://qiangmzsx.blog.51cto.com/2052549/1359952

0 0
原创粉丝点击