java 显示 装配_【spring】---spring的装配Bean方式
装配Bean方式
一、装配Bean方式汇总
Spring容器负责创建Bean并通过DI来协调对象间关系。
Bean如何进行装配,spring提供了下面三种基本方式+混合方式。
很多场景可以通过组件扫描和自动装配方式实现自动化装配Bean,但是,需要将第三方库的组件装配到应用中,是没有办法在它的类上添加@Component和@Autowired注解。此时只能采用显示装配Bean:Java显式和XML显式。
二、自动化装配Bean
实现自动化装配Bean,主要有两步骤:组件扫描和自动装配。
组件扫描(component scanning):Spring 会自动发现应用上下文中所创建的 bean【默认不开启】。
自动装配(autowiring):让Spring自动满足bean依赖的一种方法,在满足依赖的过程中,会在 Spring 应用上下文中寻找匹配某个 bean 需求的其他 bean【可使用@Autowired 注解实现】。
2.1 组件扫描
Spring默认情况下,组件扫描是不启用的。我们还需要显式配置一下 Spring,从而命令它去寻找带有@Component、@Service注解的类,并为其创建bean。
@Configuration --配置spring容器(应用上下文),将该类注入成Bean对象
@ComponentScan ----在spring中启用组件扫描
public class scanConfig {
}
—由于没有其他配置信息,那么@ComponentScan会默认扫描scanConfig类所在的包及包下的所有子包,查找带@Component、@Service注解的类。
2.2 自动装配
可以利用@Autowired注解帮忙寻找Bean及依赖的Bean信息。
2.3 具体实例讲解
下面以实际例子讲述@Component、@Service注解的类,怎样将Bean对象扫描到IOC容器,并且怎么装配使用。
—接口
public interface AutoBeanDesc {
public String way();
}
—实现子类(@Component)
@Component
public class DescImpl implements AutoBeanDesc{
@Override
public String way() {
return "DescImpl way .";
}
}
—注解类(@Component)
@Component
public class AutowiConstructorDesc {
private AutoBeanDesc autoBeanDesc;
@Autowired //构造器上加注解
public AutowiConstructorDesc(AutoBeanDesc autoBeanDesc){
this.autoBeanDesc = autoBeanDesc;
}
public void desc1(){
System.out.println(autoBeanDesc.way()+"AutowiConstructorDesc");
}
}
—注解类(@Service)
@Service
public class AutowiSetterDesc {
private AutoBeanDesc autoBeanDesc;
/**
* 将 required 属性设置为false 时,Spring 会尝试执行自动装配,
* 但是如果没有匹配的 bean 的话,Spring 将会让这个 bean 处于未装配的状 态。
*/
@Autowired(required=false) //用在Setter方法
public void setCompactDisc(AutoBeanDesc autoBeanDesc){
this.autoBeanDesc = autoBeanDesc;
}
public void desc1(){
System.out.println(autoBeanDesc.way()+"AutowiSetterDesc");
}
}
@Configuration
//@ComponentScan(basePackages ={"com.wwy.JavaBean.*"})
@ComponentScan(basePackages ={"com.wwy.JavaBean.AutoConfigBean"})
//@ComponentScan(basePackages ={"com.wwy.JavaBean.AutoConfigBean","com.wwy.JavaBean.XmlConfigBean"})
public class BeanConfig {
}
在JavaBean包下,有一个BeanConfig类,这个类没任何信息,@ComponentScan注解是spring启动组件扫描,@Configuration注解将BeanConfig类注入到Bean对象。
—Test验证
@ContextConfiguration(classes = BeanConfig.class) //指定bean注入的配置文件
//使用标准的JUnit @RunWith注释来告诉JUnit使用Spring TestRunner
@RunWith(SpringJUnit4ClassRunner.class)
public class test {
@Autowired
private AutoBeanDesc autoBeanDesc;
@Autowired
AutowiConstructorDesc autowiConstructorDesc;
@Autowired
AutowiSetterDesc autowiSetterDesc;
@Test
public void test() {
System.out.println(autoBeanDesc.way());
autowiConstructorDesc.desc1();
autowiSetterDesc.desc1();
}
}
三、Java显式装配Bean
—接口及实现子类
public interface JavaBeanDesc {
public String way();
}
public class JavaBeanDescImpl implements JavaBeanDesc {
@Override
public String way() {
return "JavaBeanDescImpl way.";
}
}
public class JavaConstructorDesc {
private JavaBeanDesc javaBeanDesc;
public JavaConstructorDesc(JavaBeanDesc javaBeanDesc){
this.javaBeanDesc = javaBeanDesc;
}
public String way(){
return "JavaConstructorDesc "+javaBeanDesc.way();
}
}
—JavaConfig类
@Configuration和@Bean将对应的类注入成Bean对象。
@Configuration //配置spring容器(应用上下文),将该类注入成Bean对象
public class JavaConfig {
@Bean
public JavaBeanDesc getJavaBeanDesc(){
return new JavaBeanDescImpl();
}
@Bean
public JavaConstructorDesc getJavaConstructorDesc(JavaBeanDesc desc){
return new JavaConstructorDesc(desc);
}
}
@Component
public class JavaBeanDescV2 {
@Autowired
JavaBeanDesc javaBeanDesc; //前面已经注入成Bean对象,所以直接装配使用
public String way(){
return "JavaBeanDescV2 "+javaBeanDesc.way();
}
}
—测试方法
@Service
public class JavaBeanService {
@Autowired
JavaBeanDesc javaBeanDesc;
@Autowired
JavaConstructorDesc javaConstructorDesc;
@Autowired
JavaBeanDescV2 javaBeanDescV2;
public void test(){
System.out.println(javaBeanDesc.way());
System.out.println(javaConstructorDesc.way());
System.out.println(javaBeanDescV2.way());
}
}
四、XML显式装配Bean
基于XML装配Bean两种方式:构造器注入、属性注入。对于强依赖,使用构造器注入;对于可选的属性使用属性注入。
4.1 构造器注入
----接口
public interface XmlBeanDesc {
public void way();
}
----实现类
public class XmlDescImpl implements XmlBeanDesc {
@Override
public void way() {
System.out.println("XmlDescImpl way .");
}
}
–这个类将字面量注入到构造器中
public class XmlDescImplV2 implements XmlBeanDesc {
private String title;
private String name;
private List list;
public XmlDescImplV2(String title,String name){
this.title = title;
this.name = name;
}
public XmlDescImplV2(String title,String name,List list){
this.title = title;
this.name = name;
this.list = list;
}
@Override
public void way() {
System.out.println("XmlDescImplV2 way . title:"+title+" name:"+name+
" list:"+ JSON.toJSONString(list));
}
}
—应用的实现类
public class XmlPlayer {
private XmlBeanDesc xmlBeanDesc;
public XmlPlayer(XmlBeanDesc xc){
this.xmlBeanDesc = xc;
}
public void play(){
xmlBeanDesc.way();
}
}
—applicationContent.xml中配置
list1
list2
—这样的话,测试使用
@Service
public class JavaBeanService {
@Autowired
XmlPlayer xmlPlayer;
@PostConstruct
public void test(){
xmlPlayer.play();
}
}
4.2 (setter)属性注入
public class XmlSetterPlayer {
private XmlBeanDesc xmlBeanDesc;
public void setXmlBeanDesc(XmlBeanDesc xc){ //setter属性方法
this.xmlBeanDesc = xc;
}
public void play(){
xmlBeanDesc.way();
}
}
—applicationContent.xml中配置
—这样的话,测试使用
@Service
public class JavaBeanService {
@Autowired
XmlSetterPlayer xmlSetterPlayer;
@PostConstruct
public void test(){
xmlSetterPlayer.play();
}
}
五、混合装配Bean
注意:下面的是参考其他博客的,具体的没尝试过。
(一)多个JavaConfig类进行配置:
在每个配置类上使用@Configuration注解;
在其中一个配置类上使用@Import(AnotherJavaConfigClass.class)即可实现导入;
【也可以在一个统一的JavaConfig类上使用@Import注解导入其他的所有JAVA配置类:@Import(AnotherJavaConfigClass.class, SomeElseJavaConfigClass.class)】
(二)在JavaConfig类中导入在XML中配置的Bean:
1.在Java配置类上增加一个@ImportResource注解:@ImportResource(“classpath:cd-config.xml”)
(三)在XML中导入另一个XML配置文件:
1.在目标XML文件中使用元素:
(四)没有一个直接的方法能将JavaConfig类导入到xml文件,间接的,通过声明一个配置累的Bean来导入:
标签:装配,Autowired,spring,class,---,Bean,way,public
来源: https://blog.csdn.net/xunmengyou1990/article/details/112713501
java 显示 装配_【spring】---spring的装配Bean方式相关推荐
- java spring 加载bean,Spring多种加载Bean方式解析
1 定义bean的方式 常见的定义Bean的方式有: 通过xml的方式,例如: ? 通过注解的方式,在Class上使用@Component等注解,例如 ? 通过在@Configuration类下的@B ...
- java 路由框架_使用Spring框架和AOP实现动态路由
本文的大体思路是展示了一次业务交易如何动态地为子系统处理过程触发业务事件.本文所示的例子使用Spring框架和Spring AOP有效地解耦业务服务和子系统处理功能.现在让我们仔细看看业务需求. 业务 ...
- java 域模型_基于Spring实现领域模型模式 - RUP实践者指南 - JavaEye技术网站
事务脚本.领域模型及表模块是Martin Fowler在<企业应用架构模式>中总结的三种领域逻辑组织模式.各有各的优点和缺点,这里不打算讨论它们各自的适用场景,只简单总结一下在应用领域模 ...
- java 熔断机制_利用Spring Cloud实现微服务- 熔断机制
2. 代码实现及验证 本次代码实现对RestTemplate和Feign两种微服务调用场景下,使用Hystrix验证Spring Cloud的熔断机制. 2.1 RestTemplate的微服务调用场 ...
- java邮件支持_使用Spring的JAVA Mail支持简化邮件发送功能
闲来无事,翻看<Spring in Action>,发现Spring集成了对JAVA Mail的支持,有点小激动的看了一遍,嗯,话说真的简单了很多. Spring的邮件发送的核心是Mail ...
- java 平滑升级_服务器spring boot版本,平滑升级
1.在pom文件中加入: org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-s ...
- java 序列化异常_关于spring:Java序列化异常消息
在本机上本地运行应用程序时,该应用程序可以完美运行. 部署到质量检查程序后,会收到以下错误. 我正在本地和QA中运行Tomcat 5.5.23. 该应用程序还使用Spring MVC. ERROR 2 ...
- java取消 验证_使用Spring Security Java配置时禁用基本身份验证
我正在尝试使用Spring Security Java配置保护Web应用程序的安全. 这是配置的样子: @Configuration @EnableWebMvcSecurity public clas ...
- java 事务嵌套_解惑 spring 嵌套事务
解惑spring嵌套事务 在所有使用spring的应用中,声明式事务管理可能是使用率最高的功能了,但是,从我观察到的情况看,绝大多数人并不能深刻理解事务声明中不同事务传播属性配置的的含义,让我们来看一 ...
- 招聘管理系统软件java源码_基于Spring Boot的java开源招聘源码-铭阳招聘管理系统...
铭阳招聘管理系统 铭阳招聘管理系统,采用流行的框架Spring Boot+mybatis+ehcache开发,实现了权限管理,solr全文搜索引擎,系统具执行效率高.模板自由切换.后台管理功能灵活等诸 ...
最新文章
- mysql整理类型_Mysql 时间类型整理
- [USACO07JAN]平衡的阵容Balanced Lineup BZOJ 1699
- 在leangoo里怎么设置看板周期,过滤看板数据?
- RPC框架(一)RPC简介
- 使用 QuickBI 搭建酷炫可视化分析
- tt桌球瞄准器手机版_传闻老任将进军手机市场?任天堂独立直面会将于周四凌晨举行...
- 发那科机器人圆弧指令怎么用_发那科机器人应用-运动指令入门(1)
- gps 简介---之一
- android aidl参数contentvalues,Android Studio实现进程间通信AIDL详细步骤
- 如何维持APP用户的登陆状态
- 游戏的现实规则和非现实规则
- aardio - 利用bitLock快速读写图片颜色值
- 如何一秒将 iPhone 屏幕变成 S8
- 蚂蚁借呗的利息计算方式?
- Flutter和RN对比分析
- php5.0 cms安装教程,MySQL_KingCMS5.0从安装到设置使用教程,1.首先到KingCMS官方下载KingCMS5.0 - phpStudy...
- 服务器刹车响应时间,驾驶员反应时间及制动响应时间
- PL/0源程序C语言版
- div大小拖动调节及鼠标样式修改
- 架构设计:系统存储(16)——Redis事件订阅和持久化存储
热门文章
- 【语音识别】基于matlab GUI HMM 1~9数字语音识别(带面板)【含Matlab源码 1393期】
- 【路径规划】基于matlab精英粒子群算法双机器人路径规划【含Matlab源码 621期】
- BP算法和RNN_RNN/LSTM BPTT详细推导以及梯度消失问题分析
- 佳能g3800故障灯说明书_虎林2020定制FW6117移动工作灯
- openai-gpt_GPT-3的不道德故事:OpenAI的百万美元模型
- append追加的html中富文本失效,jquery append 动态添加的元素事件on 不起作用的解决方案...
- Python二级题库答案纠正
- oracle 12c transaction guard,保障业务连续性的神器
- docxtemplater 图片模块_使用docxtemplater来处理word模板
- labelcontrol 多行_ios – UISegmentedControl中的两行文本