在 Spring 中,尽管使用 XML 配置文件可以实现 Bean 的装配工作,但如果应用中 Bean 的数量较多,会导致 XML 配置文件过于臃肿,从而给维护和升级带来一定的困难。

Java 从 JDK 5.0 以后,提供了 Annotation(注解)功能,Spring 也提供了对 Annotation 技术的全面支持。Spring3 中定义了一系列的 Annotation(注解),常用的注解如下。

1 @Component
可以使用此注解描述 Spring 中的 Bean,但它是一个泛化的概念,仅仅表示一个组件(Bean),并且可以作用在任何层次。使用时只需将该注解标注在相应类上即可。

2 @Repository
用于将数据访问层(DAO层)的类标识为 Spring 中的 Bean,其功能与 @Component 相同。

3 @Service
通常作用在业务层(Service 层),用于将业务层的类标识为 Spring 中的 Bean,其功能与 @Component 相同。

4 @Controller
通常作用在控制层(如 Struts2 的 Action),用于将控制层的类标识为 Spring 中的 Bean,其功能与 @Component 相同。

5 @Autowired
用于对 Bean 的属性变量、属性的 Set 方法及构造函数进行标注,配合对应的注解处理器完成 Bean 的自动配置工作。默认按照 Bean 的类型进行装配。

6 @Resource
其作用与 Autowired 一样。其区别在于 @Autowired 默认按照 Bean 类型装配,而 @Resource 默认按照 Bean 实例名称进行装配。

@Resource 中有两个重要属性:name 和 type。

Spring 将 name 属性解析为 Bean 实例名称,type 属性解析为 Bean 实例类型。如果指定 name 属性,则按实例名称进行装配;如果指定 type 属性,则按 Bean 类型进行装配。

如果都不指定,则先按 Bean 实例名称装配,如果不能匹配,则再按照 Bean 类型进行装配;如果都无法匹配,则抛出 NoSuchBeanDefinitionException 异常。

7 @Qualifier
与 @Autowired 注解配合使用,会将默认的按 Bean 类型装配修改为按 Bean 的实例名称装配,Bean 的实例名称由 @Qualifier 注解的参数指定。

1. 创建 DAO 层接口
在 src 目录下创建一个名为 com.zsh 的包,在该包下创建一个名为 PersonDao 的接口,并添加一个 add() 方法,如下所示。

package com.zsh;
public interface PersonDao {public void add();
}

2. 创建 DAO 层接口的实现类
在 com.zsh 包下创建 PersonDao 接口的实现类 PersonDaoImpl,编辑后如下所示。

package com.zsh;
import org.springframework.stereotype.Repository;@Repository("personDao")
public class PersonDaoImpl implements PersonDao {@Overridepublic void add() {System.out.println("Dao层的add()方法执行了...");}
}

上述代码中,首先使用 @Repository 注解将 PersonDaoImpl 类标识为 Spring 中的 Bean,其写法相当于配置文件中 <bean id="personDao"class=“com.zsh.PersonDaoImpl”/> 的书写。然后在 add() 方法中输出一句话,用于验证是否成功调用了该方法。

3. 创建 Service 层接口
在 com.zsh包下创建一个名为 PersonService 的接口,并添加一个 add() 方法,如下所示。

package com.zsh;public interface PersonService {public void add();
}

4. 创建 Service 层接口的实现类
在 com.zsh 包下创建 PersonService 接口的实现类 PersonServiceImpl,编辑后如下所示。

package com.zsh;import javax.annotation.Resource;
import org.springframework.stereotype.Service;@Service("personService")
public class PersonServiceImpl implements PersonService {@Resource(name = "personDao")private PersonDao personDao;public PersonDao getPersonDao() {return personDao;}@Overridepublic void add() {personDao.add();// 调用personDao中的add()方法System.out.println("Service层的add()方法执行了...");}
}

上述代码中,首先使用 @Service 注解将 PersonServiceImpl 类标识为 Spring 中的 Bean,其写法相当于配置文件中 <bean id="personService"class=“com.zsh.PersonServiceImpl”/> 的书写。

然后使用 @Resource 注解标注在属性 personDao 上(也可标注在 personDao 的 setPersonDao() 方法上),这相当于配置文件中 <property name="personDao"ref=“personDao”/> 的写法。最后在该类的 add() 方法中调用 personDao 中的 add() 方法,并输出一句话。

5. 创建 Action
在 com.zsh 包下创建一个名为 PersonAction 的类,编辑后如下所示。

package com.zsh;import javax.annotation.Resource;
import org.springframework.stereotype.Controller;@Controller("personAction")
public class PersonAction {@Resource(name = "personService")private PersonService personService;public PersonService getPersonService() {return personService;}public void add() {personService.add(); // 调用personService中的add()方法System.out.println("Action层的add()方法执行了...");}
}

上述代码中,首先使用 @Controller 注解标注 PersonAction 类,其写法相当于在配置文件中编写 <bean id="personAction"class=“com.zsh.PersonAction”/>。

然后使用了 @Resource 注解标注在 personService 上,这相当于在配置文件内编写 <property name="personService"ref=“personService”/>。

最后在其 add() 方法中调用了 personService 中的 add() 方法,并输出一句话。

6. 创建 Spring 配置文件
在 com.zsh 包下创建一个名为 applicationContext.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:aop="http://www.springframework.org/schema/aop"xmlns:p="http://www.springframework.org/schema/p"xmlns:tx="http://www.springframework.org/schema/tx"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.5.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-2.5.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-2.5.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><!--使用context命名空间,通知spring扫描指定目录,进行注解的解析--><context:component-scan base-package="com.zsh"/>
</beans>

与之前的配置文件相比,上述代码的元素中增加了第 7 行、第 15 行和第 16 行中包含有 context 的代码,然后在第 18 行代码中,使用 context 命名空间的 component-scan 元素进行注解的扫描,其 base-package 属性用于通知 spring 所需要扫描的目录。

7. 创建测试类
在 com.zsh 包下创建一个名为 AnnotationTest 的测试类,编辑后如下所示。

package com.zsh;import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class AnnotationTest {@Testpublic void test() {// 定义Spring配置文件路径String xmlPath = "com/zsh/applicationContext.xml";// 初始化Spring容器,加载配置文件,并对bean进行实例化ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);// 获得personAction实例PersonAction personAction = (PersonAction) applicationContext.getBean("personAction");// 调用personAction中的add()方法personAction.add();}
}

上述代码中,首先通过加载配置文件并获取 personAction 的实例,然后调用该实例的 add() 方法。

8. 运行程序并查看结果
使用 JUnit 测试运行 test() 方法,运行成功后,输出如下。

从输出结果中可以看出,DAO 层、Service 层和 Action 层的 add() 方法都成功输出了结果。由此可知,使用 Annotation 装配 Bean 的方式已经成功实现了。

Spring基于Annotation装配Bean相关推荐

  1. Spring基于XML装配Bean

    Bean 的装配可以理解为依赖关系注入,Bean 的装配方式也就是 Bean 的依赖注入方式.Spring 容器支持多种形式的 Bean 的装配方式,如基于 XML 的 Bean 装配.基于 Anno ...

  2. Spring 基于Java的Bean声明

    Spring 基于Java的Bean声明 使用@Configuration进行设置: Xml: <?xml version="1.0" encoding="UTF- ...

  3. Spring学习(二)--装配Bean

    一.Spring装配机制 Spring提供了三种主要的装配机制: 1.在XML中进行显示配置 2.在Java中进行显示配置 3.隐式的bean发现机制和自动装配 --自动化装配bean Spring可 ...

  4. Spring基于 Annotation 的简单介绍

    1.使用 @Repository.@Service.@Controller 和 @Component 将类标识为 Bean: Spring 自 2.0 版本开始,陆续引入了一些注解用于简化 Sprin ...

  5. Spring基于Annotation实现事务管理

    在 Spring 中,除了使用基于 XML 的方式可以实现声明式事务管理以外,还可以通过 Annotation 注解的方式实现声明式事务管理. 使用 Annotation 的方式非常简单,只需要在项目 ...

  6. Spring通过注解装配Bean

    通过注解实现ServiceImpl业务 一.使用@Component装配Bean 1. 定义类:User 在类上面加@Component注解,在属性上面加@Value值 package com.wbg ...

  7. (Spring)自动装配bean

    文章目录 自动装配bean 1. 环境搭建 2. byName自动装配 3. byType自动装配 4. 使用注解自动装配 4.1 @Autowired和@Qualifier 4.2 @Resourc ...

  8. spring实战三装配bean之Bean的作用域以及初始化和销毁Bean

    1.Bean的作用域 所有的spring bean默认都是单例.当容器分配一个Bean时,不论是通过装配还是调用容器的getBean()方法,它总是返回Bean的同一个实例.有时候需要每次请求时都获得 ...

  9. Spring : spring基于xml配置Bean

    1.美图 2.案例 2.1 项目结构 2.2 user类 package com.spring.bean;import java.util.List;

最新文章

  1. java严格区分大小写吗_Java是否区分大小写?
  2. Google Glog使用
  3. 通俗易懂地解释遗传算法?有什么例子?
  4. HIVE入门之数据模型
  5. bootstrap-fileinput 简单使用
  6. 微信小程序用户拒绝授权之后重新调用
  7. 数据解析(XML,JSON)
  8. Java 接口和抽象类的异同点
  9. flex向java传递 OBJECT
  10. LNMP的安装(命令)
  11. Unity--初识Live2D Cubism以及通过代码来实现Live2D模型的基本功能(二)
  12. 思维固化,addTarget难道就只能给self
  13. verilog prbs
  14. 全新体验的飞冰 2.0 正式发布
  15. 好莱坞经典十大战争电影排行榜 男人必看十大战争片
  16. 一维卷积处理时间序列
  17. Buhtrap在最新监控活动中使用多个0 day漏洞
  18. 2021年焊工(初级)考试报名及焊工(初级)模拟试题
  19. 民谣与2017年终总结
  20. mysql分组取出每组地一条数据_基于mysql实现group by取各分组最新一条数据

热门文章

  1. python爬取京东评论_Python如何爬取京东的评价信息
  2. java实现复制粘贴的计算器_软帝学院教你用java编写计算器(三)
  3. 织梦html权限设置,详细的Dede织梦目录权限安全设置教程
  4. win7更改用户登录或注销方式的操作教程
  5. 日志框架介绍(SLF4J及其使用)
  6. mysql,in中重复的记录也查出的方法
  7. Eureka 与Zookeeper 的区别,Eureka相较于Zookeeper好在哪?
  8. 用自定义注解做点什么——自定义注解有什么用
  9. java xml 读取库_Java开发中读取XML与properties配置文件的方法
  10. hadoop 单机单间_Hadoop单机模式配置