微信公众号: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. Spring MVC中使用POI导出Word

    内容绝大部分来源于网络 准备工作 准备[XwpfTUtil]工具类(来源于网络) 准备word模版 下载[XwpfTUtil]工具类 import org.apache.poi.xwpf.usermo ...

  2. Linux普通用户修改owner非本人文件为什么成功

    关键字:错误提示:E45 已设定选项’readonly’(请加!强制执行) Linux对文件和目录有很好的权限管理,但今天遇到一个比较诡异的事情,普通用户对文件权限不可写,但可以强制保存该文件,这样就 ...

  3. Linux指令--chown

    chown将指定文件的拥有者改为指定的用户或组,用户可以是用户名或者用户ID:组可以是组名或者组ID:文件是以空格分开的要改变权限的文件列表,支持通配符.系统管理员经常使用chown命令,在将文件拷贝 ...

  4. Java多线程之线程的通信

    Java多线程之线程的通信 在总结多线程通信前先介绍一个概念:锁池.线程因为未拿到锁标记而发生的阻塞不同于前面五个基本状态中的阻塞,称为锁池.每个对象都有自己的锁池的空间,用于放置等待运行的线程.这些 ...

  5. CSS 自动隐藏文字并添加省略号

    .cut { overflow:hidden; white-space:nowrap; text-overflow:ellipsis; -o-text-overflow:ellipsis; -icab ...

  6. js禁止滚动条移动

    js禁止滚动条移动 var scrollFunc=function(e){ e=e||window.event; if (e&&e.preventDefault){ e.prevent ...

  7. 编译原理:基于状态转换图识别for语句

    int state =0;while(state<9){ switch state{ case 0: if(ch=='f'){ state=1;getchar(ch); } case 1: if ...

  8. 20165318 预备作业二 学习基础和C语言基础调查

    20165318 学习基础和C语言基础调查 技能学习经验 我们这一代人,或多或少的都上过各种兴趣班,舞蹈钢琴画画书法,我也是如此.可这些技能中,唯一能拿的出手的就是舞蹈了.按照<优秀的教学方法- ...

  9. 自动化安装DHCP配置脚本

    DHCP配置脚本: #!/bin/sh NET=192.168.6.0 MASK=255.255.255.0 RANGE="192.168.6.50 192.168.6.100" ...

  10. 正确理解python的装饰器

    一直在用别人写的装饰器,从来没有对其原理进行深入的探究.今天趁有点闲着的时间,把装饰器的原理好好看了一遍,做一下整理. 一.装饰器的基本原理 装饰器就是一个可以接受调用也可以返回调用的调用.装饰器本身 ...