二、Spring装配Bean
内容
- 声明bean
- 构造器注入和Setter方法注入
- 装配Bean
- 控制bean的创建和销毁
关键词
- 装配(wiring)
- 组件扫描(component scanning)
- 自动装配(AutoWiring)
2.1 Spring配置的可选方案
Spring容器负责创建应用程序中的bean并通过DI来协调这些对象之间的关系,而我们就是需要控制Spring要创建哪些Bean并且如何将其装配在一起。
Spring提供了三种装配机制:
- 在XML中显式配置
- 在Java中进行显式配置(JavaConfig)
- 隐式的bean发现机制和自动装配
web开发,提供三个@Component注解衍生注解(功能一样)取代
@Repository: Dao层
@Service: Service层
@Controller:web层
依赖注入:(给私有字段,或者setter方法)
- 普通值:@Value("")
- 引用值:
- 按照类型注入:@Autowired
- 按照名称注入
- @Autowired+@Qualifier("名称")
- @Resource("名称")
2.2 自动化装配bean
自动化装配实现
- 组件扫描(component scanning):Spring会自动发现应用上下文中所创建的bean
- 自动装配(autowiring):Spring自动满足bean之间的依赖。
组件扫描和自动装配在一起会显示出强大的威力,并将显式配置降低到最少。
// java接口
package Book;
public interface PutBook {
void put();
}
// Java接口实现类
package Book;
import org.springframework.stereotype.Component;
@Component
public class SetBook implements PutBook {
private String book_name = "Harry Potter";
private String author = "JK";
public void put() {
System.out.println("book_name"+book_name+"author:"+author);
}
}
注意第二段代码使用了@Component,这个注解将该类作为了组件类,并告知Spring为该类创建一个bean。但是该组件扫描默认不启用,需要显式配置Spring,从而命令它去寻找带有@Component的注解的类,并为其创建bean。
// 启用组件扫描类
package Book;
import org.springframework.context.annotation.componentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan
public class bookConfig {
}
ComponentScan默认会扫描鱼配置类相同的包,从而发现带有Component注解的类,并在Spring中自动为其创建一个bean
// 测试代码
package com.baidu.hankanvideo.book;
import static org.junit.Assert.*;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.ContextConfiguration;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = BookConfig.class)
public class BookTest {
@Autowired
private PutBook putBook;
@Test
public void bookIsNotBeNull() {
assertNotNull(putBook);
}
}
以上为单元测试代码,通过检查PutBook属性是否为null,不为null则证明可以发现并注入。
2.2.1 为组件扫描的bean命名
Spring应用上下文中所有的bean都会给定一个ID。如果不指定则会根据类名来指定一个ID。
@Component("lonelyHearts")
public class SetBook implements PutBook {
}
2.2.2 设置组件扫描的基础包
目前ComponentScan扫描包的范围会以配置类所在的包作为基础包(base package)进行扫描,所以指定包和多个包的配置如下。
// 一、单个包
@Configuration
@ComponentScan("model")
或者
@ComponentScan(basePackages="model")
// 二、多个包
@Configuration
@ComponentScan(basePackages={"model","service"})
// 以上方法简单但是不够安全,如果包重构或者类被放到其他包,就会出现问题。所以指定类或者接口
@Configuration
@ComponentScan(basePackageClasses={Book.class,PutBook.class})
2.2.3 通过为bean添加注解实现自动装配
自动装配就是让Spring自动满足bean依赖的一种方法,在满足依赖的过程中描绘在Spring应用上下文中寻找匹配某个bean需求的其他bean。为了声明要进行的自动装配,在Spring中使用@AutoWired。
// Java接口实现类
package Book;
import org.springframework.stereotype.Component;
@Component
public class SetBook implements PutBook {
private String book_name = "Harry Potter";
private String author = "JK";
@AutoWired
public BookStore(PutBook putBook) {
this.book = putBook;
}
public void put() {
System.out.println("book_name"+book_name+"author:"+author);
}
}
总结:
- @AutoWired可以用在构造器上
- @AutoWired可以用在属性的Setter方法上
- 还可以用在类的任何方法上
2.3 通过Java代码装配bean(显式装配)
将第三方库中的组件装配到应用中,就需要使用显式配置的方式,而上面通过组件扫描和自动装配的自动化配置是不可用的。
JavaConfig是配置代码,意味着它不应该包含任何业务逻辑,JavaConfig也不应该侵入到业务逻辑代码中。因此常常会将JavaConfig放到单独的包中,使其与其他的应用程序逻辑分离开来。
2.3.1 创建配置类
// 启用组件扫描类
package Book;
import org.springframework.context.annotation.Configuration;
@Configuration
public class bookConfig {
}
单单只有@Configuration注解,但是缺少了上面的ComponentScan注解就会失效。
那么显式配置怎么做呢?
2.3.2 声明简单的bean
// 启用组件扫描类
package Book;
import org.springframework.context.annotation.Configuration;
@Configuration
public class bookConfig {
// 新增一个方法注册一个Bean
@Bean
public CompactDisc sgtPeppers() {
return new SgtPeppers();
}
}
@Bean 注解会告诉Spring这个方法将返回一个对象,该对象要注册为Spring应用上下文中的bean。方法体中包含最终产生bean实例的逻辑。
2.3.3 借助JavaConfig实现注入
package soundsystem;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class CDPlayerConfig {
@Bean
public CompactDisc compactDisc() {
return new SgtPeppers();
}
@Bean
public CDPlayer cdPlayer(CompactDisc compactDisc) {
return new CDPlayer(compactDisc);
}
}
cdPlayer()方法请求一个CompactDisc作为参数。当Spring调用cdPlayer()创建CDPlayerbean的时候,它会自动装配一个CompactDisc到配置方法中。然后方法体就可以按照合适的方式使用它。这种方法可以不需引用CompactDisc的@Bean的方法。
2.4 总结
Spring框架的核心是Spring容器,容器负责管理应用中组件的生命周期,它会创建这些组件并保证他们的依赖能够得到满足,保证组件完成预定的任务。
写了一个小例子
package com.example.springlearn.testDI;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
// 表明这是一个Controller注解,等价与Component
@Controller
public class BookController {
// 自动注入并指定ID
@Autowired
@Qualifier("bsId")
private BookService bookService;
public void showBook() {
bookService.saveBook();
}
}
// 接口
package com.example.springlearn.testDI;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Service;
public interface BookService {
public void saveBook();
}
// 接口的实现类
package com.example.springlearn.testDI;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
@Service("bsId")
public class BookServiceImpl implements BookService {
// 以前
// private BookDao bookDao = new BookDaoImpl()
private BookDao bookDao;
// 注入了Dao层
@Autowired
@Qualifier(value = "BookId")
public void setBookDao(BookDao bookDao) {
this.bookDao = bookDao;
}
@Override
public void saveBook() {
this.bookDao.addBook();
}
}
package com.example.springlearn.testDI;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Repository;
// Dao层接口
public interface BookDao {
public void addBook();
}
package com.example.springlearn.testDI;
import org.springframework.stereotype.Repository;
// Dao层实现类,并用Repository注册
@Repository("BookId")
public class BookDaoImpl implements BookDao {
@Override
public void addBook() {
System.out.println("add a book");
}
}
// 写了一个测试类
package com.example.springlearn;
import com.example.springlearn.testDI.BookController;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class TestCarAspect {
@Autowired
private BookController bookController;
@Test
public void testCar() {
bookController.showBook();
}
}
二、Spring装配Bean的更多相关文章
- Spring学习笔记(二)之装配Bean
一,介绍Bean的装配机制 在Spring中,容器负责对象的创建并通过DI来协调对象之间的关系.但是我们要告诉Spring创建哪些Bean并且如何将其装配在一起.,装配wiring就是DI依赖注入的本 ...
- Spring装配bean
Spring配置的可选方案 Spring提供了如下三种装配机制: (1)在XML中显式配置 (2)在Java中显式配置 (3)隐式的bean发现机制和自动装配 Spring有多种方式可以装配bean, ...
- Spring 装配Bean
Spring 装配Bean 装配解释: 创建应用对象之间协作关系的的行为通常称为装配(wiring),这也是依赖注入的本质 依赖注入是Spring的基础要素 一 : 使用spring装配Bean基础介 ...
- Spring装配Bean之XML装配bean
在Spring刚出现的时候,XML是描述配置的主要方式,在Spring的名义下,我们创建了无数行XML代码.在一定程度上,Spring成为了XML的同义词. 现在随着强大的自动化配置和Java代码的配 ...
- Spring装配Bean的过程补充
对上一篇的<Spring装配Bean的过程>的过程说一下,不然真产生了误区. 误区在哪里呢?那就是spring bean的作用域问题. 说哈常用的两种作用域:默认是scope = sing ...
- Spring装配Bean的过程
首先说一个概念:“懒加载” 懒加载:就是我们在spring容器启动的是先不把所有的bean都加载到spring的容器中去,而是在当需要用的时候,才把这个对象实例化到容器中. spring配置文件中be ...
- Spring 装配Bean入门级
装配解释: 创建应用对象之间协作关系的的行为通常称为装配(wiring),这也是依赖注入的本质 依赖注入是Spring的基础要素 一 : 使用spring装配Bean基础介绍 1 :声明Bean B ...
- 【转】spring 装配Bean中构造参数的注入
转载自:http://www.bianceng.cn/Programming/Java/201307/37027.htm spring 装配Bean中构造参数的注入 spring装配bean中还有一种 ...
- Spring学习系列(二) 自动化装配Bean
一.Spring装配-自动化装配 @Component和@ComponentScan 通过spring注解(@Component)来表明该类会作为组件类,并告知Spring要为这类创建bean,不过组 ...
随机推荐
- OpenRASP管理后台安装记录
OpenRASP项目地址https://rasp.baidu.com/ 一.安装java 在CentOS中安装ElasticSearch需要Java1.8.0,可执行命令java -version查看 ...
- 数学--数论--欧拉降幂--P5091 欧拉定理
题目背景 出题人也想写有趣的题面,可惜并没有能力. 题目描述 给你三个正整数,a,m,ba,m,ba,m,b,你需要求:ab mod ma^b \bmod mabmodm 输入格式 一行三个整数,a, ...
- Codeforces Round #623 (Div. 2, based on VK Cup 2019-2020 - Elimination Round, Engine) C. Restoring
C. Restoring Permutation time limit per test1 second memory limit per test256 megabytes inputstandar ...
- MySQL 中 on与where筛选条件的区别
在两张表连接的时候才会有on的筛选条件,那么on和where的区别是什么呢? 在inner join中是没有区别的,但是在左连接和右连接中,区别就体现出来了,下面以左连接为例: 1.用on的时候,只对 ...
- nnIPXougCC
13:58:31 2020-03-14 发现一本书叫做<活法> 学习ing 2020-03-14 15:22:36 太快 ,练习了一会sql语句和打字 想看一会 憨豆特 ...
- IOS抓取与反抓取
目录 IOS抓取基础知识 IOS抓取方式 iOS破解 模拟器 黑雷苹果模拟器 介绍 局限 改机软件 常用改机软件 检测 可更改属性 注入与Hook(越狱下实现作弊) 注入方式 Hook方式 重打包(非 ...
- P1353 Running S
题意:https://www.luogu.com.cn/problem/P1353 奶牛们打算通过锻炼来培养自己的运动细胞,作为其中的一员,贝茜选择的运动方式是每天进行 n 分钟的晨跑.在每分钟的开始 ...
- Day_09【常用API】扩展案例3_删除源字符串中的指定字符,并计算指定字符出现的次数
分析以下需求,并用代码实现 1.键盘录入一个源字符串由字符串变量scrStr接收 2.键盘录入一个要删除的字符串由字符串变量delStr接收 3.要求 删除该字scrStr符串中的所有delStr字符 ...
- 译文:在GraalVM中部署运行Spring Boot应用
GraalVM是一种高性能的多语言虚拟机,用于运行以JavaScript等基于LLVM的各种语言编写的应用程序.对于Java应用也可作为通常JVM的替代,它更具有性能优势.GraalVM带来的一个有趣 ...
- [hdu5101]计数问题
http://acm.hdu.edu.cn/showproblem.php?pid=5101 题目大意:给n个集合,求从两个不同集合里面各取一个数使得它们的和大于给定数的方案数. ans=从所有数里面 ...