专栏首页IT 指南者专栏Spring框架系列(二)之Bean的注解管理

Spring框架系列(二)之Bean的注解管理

微信公众号: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的配置:结构清晰,但开发不便
  • 基于注解的配置:属性注入容易,开发方便

后台回复 “Spring系列二” 获取本项目源码

您可能还喜欢:

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

本文分享自微信公众号 - compassblog(gh_7303ea249902)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-02-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • SpringMVC 框架系列之初识与入门实例

    微信公众号:compassblog 欢迎关注、转发,互相学习,共同进步! 有任何问题,请后台留言联系! 1、SpringMVC 概述 (1)、 MVC:Mode...

    compassblog
  • SSM 框架快速整合实例--学生查询

    SSM 框架即 Spring 框架、SpringMVC 框架、MyBatis 框架,关于这几个框架的基础和入门程序,我前面已经写过几篇文章作为基础和入门介绍了。...

    compassblog
  • SSM 框架快速整合实例--学生查询

    SSM 框架即 Spring 框架、SpringMVC 框架、MyBatis 框架,关于这几个框架的基础和入门程序,我前面已经写过几篇文章作为基础和入门介绍了。

    compassblog
  • Spring Boot+JPA+Mysql完成数据库整合操作

    Spring Boot结合JPA操作Mysql数据库十分方便,可以做到零配置文件。具体流程如下。

    itlemon
  • (四)SpringBoot2.0基础篇- 多数据源,JdbcTemplate和JpaRepository

  • 重温java代理模式

    我是攻城师
  • Java并发之Executor(返回结果处理)运行多个任务并处理第一个结果运行多个任务并处理所有结果

    并发编程常见的问题,就是当采用多个并发任务来解决一个问题,我们往往只对第一个返回的结果有兴趣。比如,对一个数组有多种排序算法,可以并发启动所有算法,但是对于一个...

    desperate633
  • 由浅入深,讲解 spring 实战详细使用——spring 源码篇

    首先,这篇文章不会详细的深入底层源码,只是基于注解和配置来说说我们的 spring 的使用,别小看基础,保证有你没用过的注解和配置,走起。

    淡定的蜗牛
  • java架构之路-(spring源码篇)由浅入深-spring实战详细使用

      今天我更新了一篇jvm垃圾回收的算法和垃圾回收器的内部逻辑,但是看的人不多啊......貌似大家还是比较喜欢看源码吧,毕竟实战要比理论用的多。

    小菜的不能再菜
  • ssh搭建开发环境

    公司一直不是ssh零配置的框架,每次写action都要在applicationcontext和struts里面配置,好麻烦,最近有空,写了一个ssh零配置的框架...

    xiangzhihong

扫码关注云+社区

领取腾讯云代金券