spring 加载java类_在Spring中基于Java类进行配置的完整步骤

在Spring中基于Java类进行配置的完整步骤

发布于 2020-7-7|

复制链接

基于Java配置选项,可以编写大多数的Spring不用配置XML,下面

前言JavaConfig 原来是 Spring 的一个子项目,它通过 Java 类的方式提供 Bean 的定义信息,在 Spring4 的版本, JavaConfig 已正式成为 Spring4 的核心功能 。本文将详细介绍关于Spring中基于Java类进行配置的相关内容,下面话不多说了,来一起看看详细的介绍吧1 定义 Bean普通的 POJO 只要标注了 @Configuration 注解,就可以为 Spring 容器提供 Bean 的定义信息。

```java

@Configuration

public class SystemConfig {

/**

* 定义 Bean,并实例化

*

* @return

*/

@Bean

public UserDao userDao() {

return new UserDao();

}

@Bean

public DeptDao deptDao() {

return new DeptDao();

}

/**

* 定义 UserService,并把之前定义的 UserDao 与 DeptDao 注入进来

*

* @return

*/

@Bean

public UserService userService() {

UserService service = new UserService();

service.setUserDao(userDao());

service.setDeptDao(deptDao());

return service;

}

}

```

这个类的方法标注了 @Bean 注解,即为定义 Bean, Bean 的类型由方法返回值的类型决定,名称默认和方法名同名,也可以通过入参显示指定 Bean 名称,比如 @Bean(name=”xxx”)。 @Bean 所标注的方法体提供了 实例化 Bean 的逻辑 。以上配置和下面的 xml 是等效的:

```java

```

基于 Java 类的配置方式和基于 XML 或者基于注解的配置方式相比——

Java 类的配置方式通过代码编程的方式,可以更加灵活地实例化 Bean 和装配 Bean 之间的关系。

XML 或者基于注解的方式都是通过声明来定义配置的,所以灵活性上要逊一些,但在配置上更简单 。

因为 @Configuration 注解类本身已经标注了 @Component,所以这些类可以像那些普通的 Bean 一样被注入到其他的 Bean 中。

```java

@Configuration

public class ApplicationConfig {

@Autowired

private SystemConfig systemConfig;

@Bean

public AuthorityService authorityService() {

AuthorityService service = new AuthorityService();

service.setUserDao(systemConfig.userDao());

service.setDeptDao(systemConfig.deptDao());

return service;

}

}

```

Spring 会对配置类中所有标注了 @Bean 的方法使用 AOP 增强,引入 Bean 的生命周期管理逻辑。比如上面的 systemConfig.userDao(),它返回的是对应 Bean 的单例。在 @Bean 中,我们还可以通过标注 @Scope 注解来控制 Bean 的作用范围:

```java

@Scope("prototype")

@Bean

public DeptDao deptDao() {

return new DeptDao();

}

```

这样每次调用 deptDao() 方法都会返回一个新的实例:

```java

assertNotSame(authorityService.getDeptDao().hashCode(),authorityService

.getDeptDao().hashCode());

```

注意: 使用基于 Java 类进行配置,类路径下必须有 Spring AOP 与 CGLib 库。2 启动 Spring 容器2.1 只使用 @Configuration 类可以使用 AnnotationConfigApplicationContext 类的构造函数传入标注了 @Configuration 的 Java 类来启动 Spring 容器 。

```java

ApplicationContext context=new AnnotationConfigApplicationContext(SystemConfig

.class);

UserService userService= (UserService) context.getBean("userService");

assertNotNull(userService);

```

如果存在多个 @Configuration 配置类,那么可以 AnnotationConfigApplicationContext 中注册它们,然后再通过刷新容器应用这些配置类:

```java

AnnotationConfigApplicationContext context=new AnnotationConfigApplicationContext();

//注册多个配置类

context.register(SystemConfig.class);

context.register(ApplicationConfig.class);

//刷新容器(应用这些配置类)

context.refresh();

ApplicationConfig config=context.getBean(ApplicationConfig.class);

assertNotNull(config);

```

也可以通过 @Import 将多个配置类组装到一个配置类中,然后仅需注册这个组装好的配置类 ,即可启动容器:

```java

@Configuration

@Import(SystemConfig.class)

public class ApplicationConfig2 {

@Autowired

private SystemConfig systemConfig;

@Bean

public AuthorityService authorityService() {

AuthorityService service = new AuthorityService();

service.setUserDao(systemConfig.userDao());

service.setDeptDao(systemConfig.deptDao());

return service;

}

}

```

单元测试:

```java

AnnotationConfigApplicationContext context=new AnnotationConfigApplicationContext(ApplicationConfig2.class);

ApplicationConfig2 config=context.getBean(ApplicationConfig2.class);

assertNotNull(config);

final AuthorityService authorityService = config.authorityService();

assertNotNull(authorityService.getDeptDao());

assertNotSame(authorityService.getDeptDao().hashCode(),authorityService

.getDeptDao().hashCode());

```

2.2 使用 XML 文件引用 @Configuration 类的配置标注了 @Configuration 的配置类也是一个 Bean,所以它也可以被 Spring 的 扫描到 。 因此如果希望将配置类组装到 XML 的配置文件中,并通过 XML 的配置文件启动 Spring,那么仅需要在 XML 中通过 扫描到相应的配置类即可 。

```java

```

2.3 在 @Configuration 类中引用 XML 文件的配置在 @Configuration 配置类中可以直接通过 @ImportResource 引入 XML 的配置文件,这样就可以直接通过 @Autowired 引用 xml 配置文件中定义的 Bean。配置文件:

```xml

```

@Configuration 类:

```java

@ImportResource("classpath:beans5-11.xml")

@Configuration

public class ServiceConfig {

@Bean

@Autowired

public RelationService relationService(GroupDao groupDao,RoleDao roleDao){

RelationService service=new RelationService();

service.setGroupDao(groupDao);

service.setRoleDao(roleDao);

return service;

}

}

```

单元测试:

```java

AnnotationConfigApplicationContext context=new AnnotationConfigApplicationContext

(ServiceConfig.class);

ServiceConfig config=context.getBean(ServiceConfig.class);

assertNotNull(config);

RelationService service=config.relationService((GroupDao) context.getBean

("groupDao"),

(RoleDao) context

.getBean

("roleDao"));

assertNotNull(service.getRoleDao());

```

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/275701.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2021 年最值得了解的 Node.js 工具(下)

大家好,我是若川,诚邀你加群长期交流。今天分享一篇用得上的 node 库。下篇。链接地址:https://github.com/huaize2020/awesome-nodejs。上篇是:2021 年最值得了解的 Node.js 工具❝前言:前端时间分享了这些node开源工…

技术点

前端所用技术 后台页面 感谢 H-ui、FlatLab 提供静态页面支持Ztree:jQuery树插件DataTables:jQuery表格插件Layer:web弹层组件Distpicker:中国省市区地址三级联动插件KindEditor:富文本编辑器 简洁方便 没UEditor那么多…

扫描java类文件_java递归与非递归实现扫描文件夹下文件的实例代码

java递归与非递归实现扫描文件夹下所有文件java扫描指定文件夹下面的所有文件,供大家参考,具体内容如下扫描一个文件夹下面的所有文件,因为文件夹的层数没有限制可能多达几十层几百层,通常会采用两种方式来遍历指定文件夹下面的所…

【阿里内部应用】基于Blink为新商业调控打造实时大数据交互查询服务

基于Blink为新商业调控打造实时大数据交互查询服务 案例与解决方案汇总页:阿里云实时计算产品案例&解决方案汇总从IT到DT、从电商到新商业,阿里巴巴的每个细胞都存在大数据的DNA,如何挖掘大数据的价值成为抢占未来先机的金钥匙&#xff0…

Vite 的好与坏

大家好,我是若川,诚邀你进群交流学习。今天分享一篇关于Vite的文章。学习源码系列、面试、年度总结、JS基础系列。全文 3000 字,欢迎点赞关注转发一、Vite 是什么2020年4月,尤大大发了这么一个推:随后,2021…

Windows phone 7新开发工具发布

春节假期已经接近尾声. 马上第一个工作日就要来临. 春节真的不再是一个简简单单的节日. 有时让人感到欣喜 这意味这一年的忙碌都会因为这个节日的到来而画上一个终止符.面临一个不长也不短的假期.眼下的一年翻过去 新的一年即将到来. 似乎一切都可以重新开始. 有时又令人感到无…

opentaps mysql_opentaps 1.4 联接 mysql 笔记

opentaps 1.4 连接 mysql 笔记一、安装 MySQ 略...二、创建MySQL Database opentaps ERP CRM1.mysql -u root -h 127.0.0.1 -p 2.mysql>create database opentaps default CHARACTER SET utf8 COLLATE utf8_general_ci;3.mysql>create user opentaps;4.mysql>grant …

这10道springboot常见面试题你需要了解下

1、什么是Spring Boot?多年来,随着新功能的增加,spring变得越来越复杂。只需访问https://spring.io/projects页面,我们就会看到可以在我们的应用程序中使用的所有Spring项目的不同功能。如果必须启动一个新的Spring项目&#xff0…

Silverlight中使用MIRIA进行触屏编程

Silverlight for Windows phone7中可以使用XNA提供的功能进行触屏编程,不过暂时还没有网页Silverlight的XNA移植。经过搜索发现MIRIA这个开源项目http://miria.codeplex.com/ 可以在Silverlight中实现Touch、Gesture的功能。 用法如下: 1、项目中引用MIG…

React 核心开发者 Dan Abramov 访谈实录

大家好,我是若川。面试、学习源码系列、年度总结、JS基础系列译者注:本译文是在「在线对话 React.js 核心开发者」一个半小时直播的基础上进行的原文翻译,包括了直播中的所有问答内容,尽可能保留了 Dan 回答的中心语义&#xff0c…

python ev3图形化编程软件下载_mPython(图形化编程软件)

mPython是盛思技术团队在BBC官方原版PythonEditor基础上、拓展开发的应用软件。可以进行可视化代码编程,有hex、python、blockly三种代码读写等功能。功能介绍1、不依赖网络,可离线安装使用2、支持hex、python、blockly三种代码的读写3、blockly模式下支…

02-15 GUCCI 我喜欢的

我觉得,GUCCI是低调的奢华,价格不是很高,容易接近,符合我的风格,是现阶段我的选择 样式我喜欢 希望我的生活质量步步高升,将来不再为追求物质生活而奋斗。 转载于:https://www.cnblogs.com/yd1227/archive/…

php 批量修改mysql 数据表,字段 字符集编码

$sql"SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA 数据库名称";$r$pdo->query($sql,2);foreach($r as $v){//if($v[TABLE_NAME]!monxin_index_user){continue;} 代码来源 梦行云软件$sql"alter table ".$v[TABLE_NAME]." conver…

python如何安装panda数据库_在Pycharm中安装Pandas库方法(简单易懂)

开发环境的搭建是一件入门比较头疼的事情,在上期的文稿基础上,增加一项Anaconda的安装介绍。Anaconda是Python的一个发行版本,安装好了Anaconda就相当于安装好了Python,并且里面还集成了很多Python科学计算的第三方库。比如我们需…

译文 | Vue 在哪些方面做的比 React 更好?

大家好,我是若川。在过去的五年中,我一直是一名 React 工程师。我爱React。我喜欢开发 React 应用程序。我认为它是目前最好的UI框架之一。但是,在这个领域有一些竞争对手。其中最大的是 Vue.js 。我以前玩过一些 Vue.js,但我认为…

表单提交中Get和Post方式的区别及EncType表明提交数据的格式详解

表单提交中Get和Post方式的区别1. get是从服务器上获取数据,post是向服务器传送数据。2. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTP post机制,将表单…

web mp4第一帧_Web成帧器就在这里!

web mp4第一帧The Framer Team is pulling up it’s pants. I sniffed something cooking when they announced a public beta for Framer for web… FRAMER FOR WEB? Yes, I don’t know how they did it, but their powerful set of tools, plugins and animation controls …

Lucene学习总结之三:Lucene的索引文件格式(2)

2019独角兽企业重金招聘Python工程师标准>>> 四、具体格式 上面曾经交代过,Lucene保存了从Index到Segment到Document到Field一直到Term的正向信息,也包括了从Term到Document映射的反向信息,还有其他一些Lucene特有的信息。下面对这…

JavaScript 数组 API 全解析

在编程世界中,数组是指元素的集合。数组将数据作为元素进行存储,并在需要时将其取出。在支持数组的编程语言中广泛地采用了这个数据结构。这个手册会介绍 JavaScript 数组的所有知识。你将会学到复杂数据处理、解构、常用数组方法等内容。我为什么写这篇…

Spoken English(001)

if he wants to make any changes,minor alternations can be made thenis there any way of ensuring well have enough time for our talks?so our evenings will be quite full then?We’ll leave some evenings free,that is, if it is all right with you.We’d have to…