微信公众号:compassblog

欢迎关注、转发,互相学习,共同进步!

有任何问题,请后台留言联系!

1、Spring中的两种容器

在系列(一)中我们已经知道,Spring 是管理对象的容器,其中有2种基本的容器,一种是 ApplicationContext,另一种是 BeanFactory (这种在开发中已经不再使用)。两种容器的区别如下:

  • ApplicationContext:这种容器在启动加载 applicationContext.xml 配置文件时就会创建

  • BeanFactory:这种容器在 getBean 的时候才会创建生成类的实例

2、Spring中Bean 的注解管理方式实例

(1)、新建项目,引入相关 jar 包,如下图所示:

(2)、在 src 下新建配置文件,开启使用注解代理配置,代码如下:

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd "> <!-- 指定扫描com.spring.bean报下的所有类中的注解.
    扫描包时,会扫描指定包下的所有子包
-->
<context:component-scan base-package="com.spring.bean"></context:component-scan>
</beans>

(3)、将对象注册到容器,并通过注解给属性注入值,代码如下:

Student.java

package com.spring.bean;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service; @Component("stu")
   @Service("stu") // service层
   @Controller("stu") // web层
   @Repository("stu")// dao层
public class Student {
   //基本属性
   private String name;    @Value("22")
   private int age;    @Autowired  //自动装配,如果匹配多个类型一致的对象,将无法选择具体注入哪一个对象
   private Book book;    //setter和getter方法
   public String getName() {
       return name;
   }    @Value("孔乙己")
   public void setName(String name) {
       this.name = name;
   }
   public int getAge() {
       return age;
   }
   public void setAge(int age) {
       this.age = age;
   }
   public Book getBook() {
       return book;
   }
   public void setBook(Book book) {
       this.book = book;
   }    @Override
   public String toString() {
       return "Student [name=" + name + ", age=" + age + ", book=" + book.toString()
               + "]";
   } }

Book.java

package com.spring.bean;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component; @Component("book")
public class Book {
   //基本属性
   @Value("Java开发")
   private String name;    @Value("68")
   private double price;    //setter和getter方法
   public String getName() {
       return name;
   }
   public void setName(String name) {
       this.name = name;
   }
   public double getPrice() {
       return price;
   }
   public void setPrice(double price) {
       this.price = price;
   }
   @Override
   public String toString() {
       return "Book [name=" + name + ", price=" + price + "]";
   } }

(4)、书写测试类,代码如下:

TestDemo.java

package com.spring.test;

import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext; import com.spring.bean.Student; public class TestDemo {
   @Test
   public void fun1(){        //1 创建容器对象
       ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
       //2 向容器获取stu对象
       Student stu1 = (Student) ac.getBean("stu");        //3 打印stu对象
       System.out.println(stu1.toString());    } }

(5)、使用 JUnit4 进行测试,结果如下图所示:

3、Spring 中 Bean 管理的常用注解

(1)、 @Component 组件:作用在类上

Spring中提供 @Component 的三个衍生注解,功能目前是一致的,这三个注解是为了让标注类本身的用途更加清晰。

  • @Controller : web 层

  • @Service : service 层

  • @Repository : dao 层

(2)、属性注入的注解:使用注解注入的方式,可以不用提供 set 方法

  • @Value :用于注入普通类型

  • @Autowired :自动装配: 默认按类型进行装配,按名称注入
    注意:如果匹配多个类型一致的对象,将无法选择具体注入哪一个对象

  • @Qualifier :强制使用名称注入,告诉spring容器自动装配哪个名称的对象

  • @Resource :手动注入,指定注入哪个名称的对象,相当于 @Autowired 和 @Qualifier 一起使用

(3)、Bean 作用范围的注解

  • @Scope:
        singleton :单例
        prototype :多例

(4)、Bean 生命周期配置的注解

  • @PostConstruct :相当于 init-method方法

  • @PreDestroy :相当于 destroy-method方法

4、Spring 中 Bean 管理方式的比较

  基于XML的配置 基于注解的配置
Bean 定义 <bean id=" " class=" "/> @Component 或者其衍生类
Bean 名称 通过 id 或 name 制定 @Component(" ")
Bean 注入 <property> 属性或者或者 p 命名空间 @Autowired 或者 @Qualifier 或者 @Resource
Bean 作用范围 scope 范围属性 @Scope
Bean 声明过程 初始化 init-methode 和销毁 destroy-method 初始化 @PostConstruct 和销毁 @PreDestroy
  • 基于XML的配置:结构清晰,但开发不便

  • 基于注解的配置:属性注入容易,开发方便

 

关注微信公众号compassblog,后台回复 “Spring系列二” 获取本项目源码

 

您可能还喜欢:

 

本系列后期仍会持续更新,欢迎关注!

如果你认为这篇文章有用,欢迎转发分享给你的好友!

本号文章可以任意转载,转载请注明出处!

扫码关注微信公众号,了解更多

Spring框架系列(二)之Bean的注解管理的更多相关文章

  1. Spring框架系列(二)--装配和注入Bean

    企业日常开发中,几乎都是Spring系的框架,无论是SSM.还是现在大火的SpringBoot+JPA/MyBatis,使用最大的目的就是简化开发 基本模块: 核心容器:Beans.Core.Cont ...

  2. Spring框架系列(8) - Spring IOC实现原理详解之Bean实例化(生命周期,循环依赖等)

    上文,我们看了IOC设计要点和设计结构:以及Spring如何实现将资源配置(以xml配置为例)通过加载,解析,生成BeanDefination并注册到IoC容器中的:容器中存放的是Bean的定义即Be ...

  3. Spring框架(3)---IOC装配Bean(注解方式)

    IOC装配Bean(注解方式) 上面一遍文章讲了通过xml来装配Bean,那么这篇来讲注解方式来讲装配Bean对象 注解方式需要在原先的基础上重新配置环境: (1)Component标签举例 1:导入 ...

  4. Spring框架系列之AOP思想

    微信公众号:compassblog 欢迎关注.转发,互相学习,共同进步! 有任何问题,请后台留言联系! 1.AOP概述 (1).什么是 AOP AOP 为 Aspect Oriented Progra ...

  5. Spring框架系列(2) - Spring简单例子引入Spring要点

    上文中我们简单介绍了Spring和Spring Framework的组件,那么这些Spring Framework组件是如何配合工作的呢?本文主要承接上文,向你展示Spring Framework组件 ...

  6. Spring框架系列(3) - 深入浅出Spring核心之控制反转(IOC)

    在Spring基础 - Spring简单例子引入Spring的核心中向你展示了IoC的基础含义,同时以此发散了一些IoC相关知识点; 本节将在此基础上进一步解读IOC的含义以及IOC的使用方式.@pd ...

  7. Spring框架系列(4) - 深入浅出Spring核心之面向切面编程(AOP)

    在Spring基础 - Spring简单例子引入Spring的核心中向你展示了AOP的基础含义,同时以此发散了一些AOP相关知识点; 本节将在此基础上进一步解读AOP的含义以及AOP的使用方式.@pd ...

  8. Spring框架系列(5) - 深入浅出SpringMVC请求流程和案例

    前文我们介绍了Spring框架和Spring框架中最为重要的两个技术点(IOC和AOP),那我们如何更好的构建上层的应用呢(比如web 应用),这便是SpringMVC:Spring MVC是Spri ...

  9. Spring框架系列(6) - Spring IOC实现原理详解之IOC体系结构设计

    在对IoC有了初步的认知后,我们开始对IOC的实现原理进行深入理解.本文将帮助你站在设计者的角度去看IOC最顶层的结构设计.@pdai Spring框架系列(6) - Spring IOC实现原理详解 ...

随机推荐

  1. vue源码入口文件分析

    开发vue项目有段时间了, 之前用angularjs 后来用 reactjs 但是那时候一直没有时间把自己看源码的思考记录下来,现在我不想再浪费这 来之不易的思考, 我要坚持!! 看源码我个人感觉非常 ...

  2. php curl实现get和post请求

    1.cURL介绍 cURL 是一个利用URL语法规定来传输文件和数据的工具,支持很多协议,如HTTP.FTP.TELNET等.最爽的是,PHP也支持 cURL 库.本文将介绍 cURL 的一些高级特性 ...

  3. php 利用Gd库添加文字水印乱码的问题及解决方案

    最近一个项目进行了服务器迁移,部署后发现 ,其中一个为图片添加水印文字的功能出现了乱码问题,确认功能代码不存在问题,同时项目代码都是使用UTF-8编码,不存在编码问题,也检查排除了字体文件出现问题的可 ...

  4. Azure Powershell获取指定订阅下的虚拟机信息(ASM)

    为方便Azure用户导出已创建虚拟机的相关信息,特编写如下脚本: 详情脚本: # 登陆Azure Account Add-AzureAccount -Environment AzureChinaClo ...

  5. Android Studio 下获取debug sha1和md5

    Open Android Studio Open Your Project Click on Gradle (From Right Side Panel, you will see Gradle Ba ...

  6. Zabbix3.4部署

    Zabbix简介 zabbix(音同 zæbix)是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案. zabbix能监视各种网络参数,保证服务器系统的安全运营:并提供灵活 ...

  7. ABP示例程序-使用AngularJs,ASP.NET MVC,Web API和EntityFramework创建N层的单页面Web应用

    本片文章翻译自ABP在CodeProject上的一个简单示例程序,网站上的程序是用ABP之前的版本创建的,模板创建界面及工程文档有所改变,本文基于最新的模板创建.通过这个简单的示例可以对ABP有个更深 ...

  8. BZOJ 4407: 于神之怒加强版 [莫比乌斯反演 线性筛]

    题意:提前给出\(k\),求\(\sum\limits_{i=1}^n \sum\limits_{j=1}^m gcd(i,j)^k\) 套路推♂倒 \[ \sum_{D=1}^n \sum_{d|D ...

  9. BZOJ 1982: [Spoj 2021]Moving Pebbles [博弈论 对称]

    给你N堆Stone,两个人玩游戏. 每次任选一堆,首先拿掉至少一个石头,然后移动任意个石子到任意堆中. 谁不能移动了,谁就输了... 以前在poj做过已经忘记了... 构造对称,选最多的一堆往其他堆分 ...

  10. BZOJ 1492: [NOI2007]货币兑换Cash [CDQ分治 斜率优化DP]

    传送门 题意:不想写... 扔链接就跑 好吧我回来了 首先发现每次兑换一定是全部兑换,因为你兑换说明有利可图,是为了后面的某一天两种卷的汇率差别明显而兑换 那么一定拿全利啊,一定比多天的组合好 $f[ ...