微信公众号: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. android项目红色感叹号

    Project --> Clean 清理一下,一般要注意的,如果是你的项目文件有错误,特别是xml文件,清理后那个R资源文件会不见的,那就需要你把错误修正后自动生成的.

  2. Aps.net中基于bootstrapt图片上传插件的应用

    Aps.net中基于bootstrapt图片上传插件的应用 在最近的项目中需要使用一个图片上传的功能,而且是多张图片同时上传到服务器的文件夹中,将图片路径存放在数据库中.为了外观好看使用了bootst ...

  3. F5负载均衡虚拟服务器配置FTP端口访问不了

    F5配置ip映射到地址池ftp服务,访问报错:FTP出现"数据 Socket 错误: 连接被拒""ftp 列表错误"解决办法 1条回答 FTP的vs类型需要选择 ...

  4. linux_操作系统

    如何查询操作系统版本? cat /etc/redhat-release 什么是操作系统? -- win10,linux都是os,应用软件和硬件打交道中间桥梁软件,管理 硬件+软件 资源,计算机系统基础 ...

  5. Windows核心编程&内核对象

    1. 一个进程在初始化时,系统将会他分配一个空的句柄表,这个句柄表仅供内核对象使用,不供用户对象和GDI对象使用.进程在首次 初始化时,该句柄表为空.句柄表是一个由数据结构组成的数组,包含一个内核对象 ...

  6. ImmutableMap

    不可变集合,为什么使用它呢?线程安全\更有效的利用内存\可作为常量 ImmutableMap.<String, Object> builder().put("yananList& ...

  7. Runtime.addShutdownHook的用法

    原文出处:http://kim-miao.iteye.com/blog/1662550.感谢作者的无私分享. 一.Runtime.addShutdownHook理解 在看别人的代码时,发现其中有这个方 ...

  8. linkin大话数据结构--Set

    Set 集合 Set 集合不允许包含相同的元素,如果试把两个相同的元素加入同一个 Set 集合中,则添加操作失败. Set 判断两个对象是否相同不是使用 == 运算符,而是根据 equals 方法.也 ...

  9. hibernate的cascade

    如果项目是针对一对多的,应该在"one"方设置cascade为delete,不能在"many"方设置cascade为delete .

  10. Base64图片编码优化

    通过对图片进行base64编码,将base64(或其他数据)内嵌在image标签的属性当中(或者CSS中或JavaScript中),可以实现将图片直接嵌入代码中的目的,如此一来,可以减少HTTP请求, ...