IOC容器装配Bean(注解方式)

1.使用注解方式进行Bean注册

xml 方式: <bean id="" class="">

spring2.5版本 提供一组注解,完成Bean注册

* @Component 描述Spring框架中Bean

导入jar 和 xml方式开发是相同的

第一步 编写Class,在声明上 添加 @Component

  1. /**
  2. * 使用Spring2.5注解 注册Bean
  3. */
  4. @Component("helloService")
  5. // <bean id="helloService" class="...." />
  6. publicclassHelloService{
  7. publicvoid sayHello(){
  8. System.out.println("hello, spring annotation!");
  9. }
  10. }
 

第二步 编写applicationContext.xml 通知Spring注解类所在包

* 需要引入 context 名称空间

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beansxmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xsi:schemaLocation="
  6. http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
  7. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
  8. <!-- 配置 注解Bean 所在包 -->
  9. <context:annotation-config/>
  10. <context:component-scanbase-package="cn.itcast.spring.a_beandefinition"></context:component-scan>
  11. </beans>
进行测试:
  1. publicclassSpringTest{
  2. @Test
  3. // 测试 注解Bean 注册
  4. publicvoid demo1(){
  5. ApplicationContext applicationContext =newClassPathXmlApplicationContext("applicationContext.xml");
  6. //bean的名称来自@Component("helloService")
  7. HelloService helloService =(HelloService) applicationContext.getBean("helloService");
  8. helloService.sayHello();
  9. }
  10. }
spring2.5 引入@Component 等效三个衍生注解 

* @Repository 用于对DAO实现类进行标注 (持久层)

* @Service 用于对Service实现类进行标注 (业务层)

* @Controller 用于对Controller实现类进行标注 (表现层)

2.属性依赖注入

1) 简单属性的注入 通过 @Value注解完成,不需要提供setter方法

  1. @Service("userService")
  2. public class UserService {
  3.     // 注入name属性
  4.     @Value("itcast")
  5.     private String name;
  6. }
 

2) 复杂属性注入,通过@Autowired注解 完成Bean自动装配

@Autowired 默认按照类型进行注入

  1. /**
  2. * 用户操作数据层
  3. */
  4. @Repository("userDAO")
  5. publicclassUserDAO{
  6. }
  1. /**
  2. * 用户业务层
  3. */
  4. @Service("userService")
  5. publicclassUserService{
  6. // 注入name属性
  7. @Value("itcast")
  8. // 简单属性
  9. privateString name;
  10.  
  11. //@Autowired默认按照类型
  12. @Autowired
  13. privateUserDAO userDAO;
  14. @Override
  15. publicString toString(){
  16. return"UserService [name="+ name +", userDAO="+ userDAO +"]";
  17. }
  18. }
@Value @Autowired注解都可以修饰 成员变量 或者 setter方法,如果修饰成员变量,不需要提供setter方法

@Autowired注解 结合 @Qualifer注解按照名称注入

  1. @Service("userService")
  2. public class UserService {
  3.     @Autowired
  4.     @Qualifier("uDAO")
  5.     // 复杂对象
  6.     private UserDAO userDAO;
  7. }
@Qualifier("userDAO")注解的名称必须与@Repository("userDAO")名称一致,就会报错!
  1. @Repository("uDAO")
  2. public class UserDAO {
  3. }

3) 使用@Resource注解 完成复杂对象Bean装配

@Resource和@Autowired注解功能相似

  1. @Autowired
  2. @Qualifer("userDAO")
  3. private UserDAO userDAO ; 
等价于 
  1. @Resource(name="userDAO")
  2. private UserDAO userDAO ;
 

3.Bean其它属性设置

1) 指定Bean的初始化方法和销毁方法(注解)  <bean init-method="" destroy-method="" />

@PostConstruct  作用 init-method

@PreDestroy  作用 destroy-method

  1. @Component("lifeBean")
  2. publicclassLifeCycleBean{
  3. @PostConstruct
  4. publicvoid setup(){
  5. System.out.println("初始化...");
  6. }
  7. @PreDestroy
  8. publicvoid teardown(){
  9. System.out.println("销毁...");
  10. }
  11. }
进行测试:
  1. @Test
  2. // 测试初始化和销毁
  3. publicvoid demo1(){
  4.     ClassPathXmlApplicationContext applicationContext =newClassPathXmlApplicationContext("applicationContext.xml");
  5.     LifeCycleBean lifeCycleBean =(LifeCycleBean) applicationContext.getBean("lifeBean");
  6.     System.out.println(lifeCycleBean);
  7.     // 销毁方法执行,必须销毁ApplicationContext
  8.     applicationContext.close();
  9. }

2) Bean的作用范围  <bean scope="" />

@Scope 注解 ,默认作用域 singleton 单例

  1. @Component("scopeBean")
  2. // 如果没有指定scope 是 singleton 单例
  3. @Scope("prototype")
  4. publicclassScopeBean{
  5. }
进行测试:
  1. @Test
  2. // 测试Bean 范围
  3. publicvoid demo2(){
  4. ApplicationContext applicationContext =newClassPathXmlApplicationContext("applicationContext.xml");
  5. ScopeBean scopeBean =(ScopeBean) applicationContext.getBean("scopeBean");
  6. System.out.println(scopeBean);
  7. ScopeBean scopeBean2 =(ScopeBean) applicationContext.getBean("scopeBean");
  8. System.out.println(scopeBean2);
  9. }

4.Spring3.0 提供 注册Bean的注解

@Configuration 指定POJO类为Spring提供Bean定义信息

@Bean 提供一个Bean定义信息

先定义2个JavaBean:

  1. // 轿车
  2. publicclassCar{
  3. privateString name;
  4. privatedouble price;
  5. publicString getName(){
  6. return name;
  7. }
  8. publicvoid setName(String name){
  9. this.name = name;
  10. }
  11. publicdouble getPrice(){
  12. return price;
  13. }
  14. publicvoid setPrice(double price){
  15. this.price = price;
  16. }
  17. @Override
  18. publicString toString(){
  19. return"Car [name="+ name +", price="+ price +"]";
  20. }
  21. }
  1. // 商品
  2. publicclassProduct{
  3. privateString pname;
  4. privateint pnum;
  5. publicString getPname(){
  6. return pname;
  7. }
  8. publicvoid setPname(String pname){
  9. this.pname = pname;
  10. }
  11. publicint getPnum(){
  12. return pnum;
  13. }
  14. publicvoid setPnum(int pnum){
  15. this.pnum = pnum;
  16. }
  17. @Override
  18. publicString toString(){
  19. return"Product [pname="+ pname +", pnum="+ pnum +"]";
  20. }
  21. }
此类需要我们自己编写,好比一个大的工厂。

  1. /**
  2. * 配置Bean (工厂)
  3. */
  4. @Configuration
  5. publicclassBeanConfig{
  6. // 提供两个方法 获得Car和Product对象
  7. @Bean(name ="car")
  8. //方法名称随意
  9. publicCar initCar(){
  10. Car car =newCar();
  11. car.setName("大众");
  12. car.setPrice(10000);
  13. return car;
  14. }
  15. @Bean(name ="product")
  16. publicProduct showProduct(){
  17. Product product =newProduct();
  18. product.setPname("空调");
  19. product.setPnum(100);
  20. return product;
  21. }
  22. }
进行测试:

  1. @Test
  2. // 获得配置Bean 工厂创建Bean对象
  3. publicvoid demo(){
  4. ApplicationContext applicationContext =newClassPathXmlApplicationContext("applicationContext.xml");
  5. Car car =(Car) applicationContext.getBean("car");
  6. System.out.println(car);
  7. Product product =(Product) applicationContext.getBean("product");
  8. System.out.println(product);
  9. }
使用配置Bean被Spring扫描到,就可以了

5.xml和注解混合使用

很多企业开发者 还是采用xml作为主流配置

* Bean 注册 通过XML完成

* 注入使用 @Autowired 注解完成

将2个Dao注入到Service

  1. // 客户DAO
  2. publicclassCustomerDAO{
  3. }
  1. // 订单DAO
  2. publicclassOrderDAO{
  3. }
Service类(注入):

  1. // 客户Service
  2. publicclassCustomerService{
  3. // xml注入
  4. privateCustomerDAO customerDAO;
  5. publicvoid setCustomerDAO(CustomerDAO customerDAO){
  6. this.customerDAO = customerDAO;
  7. }
  8. @Override
  9. publicString toString(){
  10. return"CustomerService [orderDAO="+ orderDAO +", customerDAO="
  11. + customerDAO +"]";
  12. }
  13. }
配置(注册):

  1. <bean id="customerDAO"class="cn.itcast.spring.e_xmluseannotaion.CustomerDAO"></bean>
  2. <bean id="orderDAO" class="cn.itcast.spring.e_xmluseannotaion.OrderDAO"></bean>
  3. <!--将DAO 注入Service-->
  4. <bean id="customerService"class="cn.itcast.spring.e_xmluseannotaion.CustomerService">
  5. <property name="customerDAO" ref="customerDAO"></property>
  6. </bean>
测试:

  1. @Test
  2. // 完成 DAO 注入到Service测试
  3. publicvoid demo(){
  4. ApplicationContext applicationContext =newClassPathXmlApplicationContext("applicationContext2.xml");
  5. CustomerService customerService =(CustomerService) applicationContext.getBean("customerService");
  6. System.out.println(customerService);
  7. }
***************************************************************************************************************************************

此时,我们发现,在注册的时候使用xml比较方便,而在注入的时候使用xml方式比较麻烦,需要提供setter方法,下面使用注解方式注入
  1. // 客户Service
  2. publicclassCustomerService{
  3. // 注解注入
  4. @Autowired
  5. privateOrderDAO orderDAO;
  6. // xml注入
  7. privateCustomerDAO customerDAO;
  8. publicvoid setCustomerDAO(CustomerDAO customerDAO){
  9. this.customerDAO = customerDAO;
  10. }
  11. @Override
  12. publicString toString(){
  13. return"CustomerService [orderDAO="+ orderDAO +", customerDAO="
  14. + customerDAO +"]";
  15. }
  16. }
 

<context:annotation-config/> 启用四个注解 使@Resource、@ PostConstruct、@ PreDestroy、@Autowired注解生效

结论 :

1、 xml配置 和 注解配置 效果完全相同

2、 如果Bean 来自第三方(源码无法改动), 必须使用xml

3、 Spring3.0 Bean注册方式, 使用比较少,主要用于Bean 构造逻辑及其复杂

来自为知笔记(Wiz)

转载于:https://www.cnblogs.com/tangwan/p/4674974.html

05_IOC容器装配Bean(注解方式)相关推荐

  1. Spring 框架 详解 (四)------IOC装配Bean(注解方式)

    Spring的注解装配Bean Spring2.5 引入使用注解去定义Bean @Component  描述Spring框架中Bean Spring的框架中提供了与@Component注解等效的三个注 ...

  2. JAVAWEB开发之Spring详解之——Spring的入门以及IOC容器装配Bean(xml和注解的方式)、Spring整合web开发、整合Junit4测试

    Spring框架学习路线 Spring的IOC Spring的AOP,AspectJ Spring的事务管理,三大框架的整合 Spring框架概述 什么是Spring?  Spring是分层的Java ...

  3. 十年架构师详解,Spring-IoC容器装配Bean

    先看一下Spring容器内部是如何协助的,也就是Spring容器.Bean的配置信息.Bean的实现类及应用程序之间的关系,架构社区:142019080 如下图 由上图我们看到,一个Bean从创建到被 ...

  4. [Spring5]IOC容器_Bean管理注解方式_注入属性@Autowired_@Qualified_@Resource_@Value

    基于注解方式实现属性注入 (1)@AutoWired:根据属性类型进行自动装配 第一步 把service和dao对象创建,在service和dao类添加创建对象注解 第二步 在service注入dao ...

  5. [Spring5]IOC容器_Bean管理注解方式_创建对象

    IOC操心Bean管理(基于注解方式) 1.什么是注解 (1)注解是代码特殊标记,格式:@注解名称(属性名称=属性值,属性名称=属性值-) (2)使用注解,注解作用在类上面,方法上面,属性上面 (3) ...

  6. [Spring5]IOC容器_Bean管理注解方式_完全注解开发

    完全注解开发 (1)创建配置类,替代xml配置文件 package com.atguigu.spring.config;import org.springframework.context.annot ...

  7. [Spring5]IOC容器_Bean管理注解方式_组件扫描配置细节

    开启组件扫描细节配置 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="ht ...

  8. Spring教程--IOC(注解方式)和整合junit

    1 IOC装配Bean(注解方式) 1.1 Spring的注解装配Bean Spring2.5 引入使用注解去定义Bean @Component  描述Spring框架中Bean Spring的框架中 ...

  9. Spring基于Annotation装配Bean

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

最新文章

  1. Python:数据导入、爬虫:csv,excel,sql,html,txt
  2. 线段树求矩形面积并 扫描线+离散化
  3. debian10新建文档_Debian 10(Buster)安装过程图文详解
  4. redis可以存多少条数据_在银行存50万元,一年能有多少利息?不工作可以吗?...
  5. Facebook 正在大规模重构 React Native
  6. java中的gridy_JAVA格局管教器.
  7. 修复jqgrid setgridparam postdata 的多次查询条件累加
  8. 【雷达通信】基于matlab GUI雷达脉冲压缩【含Matlab源码 303期】
  9. 行路难PPT计算机考试,《行路难》公开课.ppt
  10. hub设备_「网络安全」网络设备篇(9)——集线器Hub
  11. T和?是什么 ?有什么区别?
  12. 《当我谈跑步时我谈些什么》:痛苦难以避免,而磨难可以选择
  13. Python-玩转数据-利用百度高德经纬度地图定位
  14. java crm 进销存 websocket即时聊天发图片文字 好友群组 SSM源码
  15. 基于ssm的基金分析系统的设计与实现-计算机毕业设计
  16. (FortiGate)飞塔防火墙IPMAC绑定设置步骤
  17. react核心精讲视频与实战教程
  18. 2021华为校园招聘算法题
  19. 免费录屏软件 Captura 及 FFmpeg 安装配置教程
  20. No provider available from registry 127.0.0.1:2181 for service com.ddbuy.ser 解决方法

热门文章

  1. plpythonu_PostgreSQL PL/Python 函数
  2. selenium java封装_selenium2.0的初步封装(java版本)
  3. PHP笔记-表格及分页功能
  4. Qt笔记-QSslSocket双向认证
  5. Java工作笔记-接入互联网的免费WebService
  6. WEB安全基础-URL跳转漏洞
  7. might和could的区别用法_might 与 could区别,谢谢,may和might的区别及用法
  8. 长沙中级职称计算机考试时间,湖南土木工程中级职称注册及每年考试时间是什么时候...
  9. mysql php宝塔 root_宝塔面板,脚本命令
  10. 数据结构之查找算法:基本概念