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
- Spring实例解析之Annotation
- spring中annotation实例
- Spring源码解读之Xml解析Annotation解析
- Spring-Bean之基于注解(Annotation)装配解析
- spring scheduled annotation 实例一
- spring scheduled annotation 实例二
- Spring的annotation注入实例
- Spring AOP annotation 简单实例
- spring之annotation
- spring学习之---Annotation
- Spring实例解析之XML装配Bean
- java annotation processing tools(APT)实例解析
- annotation(注解) 解析与实例一
- Spring之AOP Annotation方式
- spring annotation 之 自动装配
- Spring 之 Annotation-->>@Autowired & @Qualifier
- Spring之AOP Annotation方式
- Spring IOC Annotation 注入 学习实例
- 堆和栈
- Hibernate整理学习(二)
- 2017年软件测试就业前景趋势
- 任务执行、取消和关闭
- Java(六) JVM内存分配策略和GC
- Spring实例解析之Annotation
- 基于Message的跨进程通信
- 线程的等待与唤醒机制
- android 使用内容提供者获取手机联系人
- OpenCV-跟我一起学数字图像处理之拉普拉斯算子
- Reactjs vs. Vuejs
- Count of Smaller Numbers After Self
- 微赞框架调用时间段的样式并封装好的函数
- Python入门