Spring-IOC实现【02-其他实现方式】
Java配置方式
SpringBoot流行之后,Java 配置开始被广泛使用。
Java配置本质上,就是使用一个Java类去代替xml配置,这种配置方式在SpringBoot中得到了广泛的使用。
实现步骤如下:
1. 创建java项目
2. 引入相关jar包
3. 创建实体类
4. 创建配置文件类
/**
* 该类相当于 application.xml文件
* @author dpb[波波烤鸭]
*
*/
@Configuration
public class AppJavaConfig {
/**
* 该方法生成一个Book对象,和application.xml文件中的bean标签一致
* 默认 id为方法名,可以通过name和value属性自定义
* @return
*/
@Bean
public Book getBook(){
return new Book();
}
}
5. 测试调用
@org.junit.Test
public void test1() {
AnnotationConfigApplicationContext ac =
new AnnotationConfigApplicationContext(AppJavaConfig.class);
Book book = ac.getBean(Book.class);
System.out.println(book);
}
自动配置
前面这种配置方式,对于所有要使用的类都需要一个一个的配置。可以通过自动配置来简化Bean的配置。
xml文件配置
xml配置通过四个注解来实现,目前来说功能是一样的
注解 | 描述 |
---|---|
@Component | 一般用在身份不明确的组件上 |
@Service | 一般用在Service层 |
@Controller | 一般用在控制层 |
@Repository | 一般用在数据库访问层 |
1. 需要在application.xml文件中开启注解扫描
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<!-- 开启注解 配置扫描路径 -->
<context:component-scan base-package="com.dpb.javabean"/>
<!-- 如果有多个路径 ,号隔开
<context:component-scan base-package="com.dpb.javabean,com.dpb.factory"/>
-->
</beans>
2. java对象中添加对应的注解
3. 测试
简单案例
1.创建项目
2.创建dao层
public interface IUserDao {
public String add();
}
public class UserDaoImpl implements IUserDao {
@Override
public String add() {
// TODO Auto-generated method stub
return "hello ... ";
}
}
3.创建service层
public interface IUserService {
public String add();
}
public class UserServiceImpl implements IUserService {
private IUserDao dao;
@Override
public String add() {
return dao.add();
}
}
4.创建controller层
public class UserController {
private IUserService service;
public String add(){
return service.add();
}
}
5.配置文件中添加扫描
<!-- 开启扫描 com.sxt.*-->
<context:component-scan
base-package="com.sxt.controller,com.sxt.service.impl,com.sxt.dao.impl"/>
6.注解使用
dao
service
controller
7.测试
/**
* 通过静态工厂获取Person对象
*/
@Test
public void test2() {
// 获取ApplicationContext对象 加载配置文件 反射+xml解析
ApplicationContext ac = new ClassPathXmlApplicationContext("application.xml");
UserController bean = ac.getBean(UserController.class);
System.out.println(bean.add());
}
扫描特殊配置
<context:component-scan base-package="com.itbaizhan"
use-default-filters="false">
<context:include-filter type="annotation"
expression="org.springframework.stereotype.Service" />
</context:component-scan>
use-default-filters
表示使用使用spring默认提供的过滤器,
false表示不使用,true则表示使用。
一般来说,
true结合exclude-filter标签使用,表示除去某个注解
false结合include标签使用,表示包含某个注解
java代码配置
Java配置和XML配置基本一致,唯一不同的地方就是包扫描的方式。
四个注解是一样的。
包扫描通过@ComponentScan来实现
1. Java配置类添加扫描注解
/**
* 该类相当于 application.xml文件
* @author dpb[波波烤鸭]
*
*/
@Configuration // 该配置是必须的
@ComponentScan("com.dpb.javabean")
public class AppJavaConfig {
}
Java配置一样可以实现精确的包扫描
/**
* 该类相当于 application.xml文件
*
* @author dpb[波波烤鸭]
*
*/
@Configuration // 该配置是必须的
@ComponentScan(value = "com.itbaizhan.bean", useDefaultFilters = false, includeFilters = {
@ComponentScan.Filter(type = FilterType.ANNOTATION, value = Service.class) })
public class AppJavaConfig {
}
2. JavaBean添加对应的注解
3. 测试
profile
在实际开发中,项目即将上线时,可能需要不停的在开发环境、生产环境、测试环境...之间进行切换。
Java配置实现
1. 创建实体类
2. 修改java配置类
/**
* 该类相当于 application.xml文件
* @author dpb[波波烤鸭]
*
*/
@Configuration // 该配置是必须的
@ComponentScan("com.dpb.javabean")
public class AppJavaConfig {
/**
* @Profile注解相当于一个标记,标记当前的dataSource是开发环境下的dataSource
* @return
*/
@Bean("ds")
@Profile("dev") // profile dev 设置 开发环境
public DataSource devDs(){
return new DataSource("http://dev1:8080/", "admin", "123456");
}
@Bean("ds")
@Profile("pro") // profile Pro 设置生产环境
public DataSource proDs(){
return new DataSource("http://pro1:8080/", "root", "666");
}
}
3. 测试切换
@org.junit.Test
public void test2() {
AnnotationConfigApplicationContext ac =
new AnnotationConfigApplicationContext();
// 设置使用哪种环境 pro dev
ac.getEnvironment().setActiveProfiles("pro");
ac.register(AppJavaConfig.class);
ac.refresh();
DataSource ds = ac.getBean(DataSource.class);
System.out.println(ds);
}
XML配置
通过xml配置实现profile,步骤如下:
1. 创建相关Bean
2. 在xml配置中配置bean
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<!-- 注意,beans标签要写在其他标签的后面。 -->
<beans profile="dev">
<bean class="com.dpb.javabean.DataSource">
<property name="url" value="dev-url"/>
<property name="userName" value="aaa"/>
<property name="password" value="111"/>
</bean>
</beans>
<beans profile="pro">
<bean class="com.dpb.javabean.DataSource">
<property name="url" value="pro-url"/>
<property name="userName" value="999"/>
<property name="password" value="222"/>
</bean>
</beans>
</beans>
3.测试数据
/**
*
* @author dpb[波波烤鸭]
*
*/
public class Test {
@org.junit.Test
public void test1() {
ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext();
ac.getEnvironment().setActiveProfiles("dev");
ac.setConfigLocation("application.xml");
ac.refresh();
DataSource bean = ac.getBean(DataSource.class);
System.out.println(bean);
}
}
条件注解
Profile实际上就是条件注解的一种特殊形式,即条件注解更加灵活,用户可以根据各种不同的条件使用不同的Bean。
条件注解在SpringBoot中使用非常广泛。SpringBoot中提供了许多自动化的配置,例如数据库配置,SpringBoot使用条件注解提前配置好许多常用的类,使用条件注解,在某一个条件满足时,这些配置就会生效。
1.创建接口
/**
* 条件注解
* 1.定义接口
* @author dpb[波波烤鸭]
*
*/
public interface ShowCmd {
String show();
}
2.创建接口的实现类
/**
* 注册接口的实现类
* @author dpb[波波烤鸭]
*
*/
public class LinuxShowCmd implements ShowCmd{
@Override
public String show() {
// TODO Auto-generated method stub
return "Liunx ls";
}
}
/**
* 注册接口的实现类
* @author dpb[波波烤鸭]
*
*/
public class WinShowCmd implements ShowCmd{
@Override
public String show() {
// TODO Auto-generated method stub
return "Windows dir";
}
}
3.定义条件Condition
/**
* 自定义的条件
* @author dpb[波波烤鸭]
*
*/
public class LinuxConditionShow implements Condition{
/**
* 条件匹配的方法
* true 条件匹配
* false 条件不匹配
*/
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
// 获取profile参数
String osName[] = context.getEnvironment().getActiveProfiles();
for (String name : osName) {
System.out.println(name);
if(name.contains("linux")){
return true;
}
}
return false;
}
}
/**
* 自定义的条件
* @author dpb[波波烤鸭]
*
*/
public class WindowsConditionShow implements Condition{
/**
* 条件匹配的方法
* true 条件匹配
* false 条件不匹配
*/
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
String osName[] = context.getEnvironment().getActiveProfiles();
for (String name : osName) {
System.out.println(name);
if(name.contains("window")){
return true;
}
}
return false;
}
}
4.java配置文件
@Configuration
public class JavaConfig {
@Bean("cmd")
// 关联条件设置
@Conditional(LinuxShowCondition.class)
public LinuxShowCmd showLinux(){
return new LinuxShowCmd();
}
@Bean("cmd")
// 关联条件设置
@Conditional(WindowsShowCondition.class)
public WindowsShowCmd showWindows(){
return new WindowsShowCmd();
}
}
5.测试调用
@org.junit.Test
public void test2() {
AnnotationConfigApplicationContext ac =
new AnnotationConfigApplicationContext();
// 设置使用哪种环境 Linux和Window;
ac.getEnvironment().setActiveProfiles("linux");
ac.register(AppJavaConfig.class);
ac.refresh();
ShowCmd show = (ShowCmd) ac.getBean("cmd");
System.out.println(show.show());
}
Bean的作用域
作用域 | 说明 |
---|---|
prototype | 每次请求,都是一个新的Bean【享元模式】 |
singleton | bean是单例的 |
request | 在一次请求中,bean的声明周期和request同步 |
session | bean的生命周期和session同步 |
在spring的配置中,默认情况下,bean都是单例的(singleton)。无论获取多少次,获取到的都是同一个bean
java配置文件中
application.xml配置文件中
混合配置
开发中可能既有配置文件存在,也在使用java配置的方式,这时候可以使用@ImportResource来实现
1.添加application.xml文件
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<bean class="com.dpb.javabean.UserBean" ></bean>
</beans>
2.java配置文件
/**
* 该类相当于 application.xml文件
* @author dpb[波波烤鸭]
*
*/
@Configuration
@ImportResource("classpath:application.xml")
public class AppJavaConfig {
@Bean
Book book(){
return new Book();
}
}
3.测试
上一篇:Spring-IOC实现【01-XML配置方式】
下一篇:Spring之AOP详解
Spring-IOC实现【02-其他实现方式】的更多相关文章
- spring IOC容器实例化Bean的方式与RequestContextListener应用
spring IOC容器实例化Bean的方式有: singleton 在spring IOC容器中仅存在一个Bean实例,Bean以单实例的方式存在. prototype 每次从容器中调用Bean时, ...
- 一篇关于spring ioc 依赖注入3种方式的文章引用
今天看到一篇spring ioc 容器依赖注入3种方式的文章,为了方便后面的复习,在此引用别人的文章,查看请戳我.
- Spring IOC以及三种注入方式
IOC是spring的最基础部分,也是核心模块,Spring的其他组件模块和应用开发都是以它为基础的.IOC把spring的面向接口编程和松耦合的思想体现的淋漓尽致. IOC概念 IOC(Invers ...
- Spring IOC 中三种注入方式
项目错误知识点记录 正文 最近在项目的时候,用到Spring框架,Spring框架提供了一种IOC的自动注入功能,可以很轻松的帮助我们创建一个Bean,这样就省的我们四处写new Object()这样 ...
- Spring Aop和Spring Ioc(一)
Spring Aop Aop: 面向切面编程的本质:面向切面编程,指扩展功能不修改源代码,将功能代码从业务逻辑代码中分离出来. 1:主要功能:日志记录,性能统计,安全控制,事务处理,异常处理等等. 2 ...
- Spring 深入——IoC 容器 02
IoC容器的实现学习--02 目录 IoC容器的实现学习--02 回顾 IoC 容器的初始化过程: BeanDefinition 的 Resource 定位 小结: 回顾 前面学习了 IoC 模式的核 ...
- spring ioc三种注入方式
spring ioc三种注入方式 IOC ,全称 (Inverse Of Control) ,中文意思为:控制反转 什么是控制反转? 控制反转是一种将组件依赖关系的创建和管理置于程序外部的技术. 由容 ...
- Spring IOC 方式结合TESTGN测试用例,测试简单java的命令模式
java命令模式: 可以命令("请求")封装成一个对象,一个命令对象通过在特定的接收着上绑定一组动作来封装一个请求.命令对象直接把执行动作和接收者包进对象中,只对外暴露出执行方法的 ...
- 【SSH系列】深入浅出spring IOC中三种依赖注入方式
spring的核心思想是IOC和AOP,IOC-控制反转,是一个重要的面向对象编程的法则来消减计算机程序的耦合问题,控制反转一般分为两种类型,依赖注入和依赖查找,依赖什么?为什么需要依赖?注入什么?控 ...
- Spring IOC 注入方式详解 附代码
引言 Spring框架作为优秀的开源框架之一,深受各大Java开发者的追捧,相信对于大家来说并不陌生,Spring之所以这么流行,少不了他的两大核心技术IOC和IOP.我们这里重点讲述Spring框架 ...
随机推荐
- 使用sublime 正则匹配替换大批量代码
1,在使用Django框架时,导入之前没有使用框架完成的网页,这时会遇到静态文件地址不匹配的问题,需要大量修改. 研究了一下sublime编译器,大家都使用正则匹配替换 2,位置在查找--替换与匹配, ...
- python2.x 到 python3.x 中“url”部分变化
这部分是笔者在亲身项目中遇到的一些变化,并不全,后面将会更新. (1) urllib.urlopen 改为: urllib.request.urlopen (2) urllib2 删除 ...
- 简单了解下java中的堆、栈和方法区。
堆.栈.方法区 1,首先了解下java中的数据类型. ①java中的八大基本数据类型:boolean, char , byte, short, int, long , float , double. ...
- docker 技术
利用docker打包一个sshd的服务 准备环境 安装docker 修改主机名与hosts解析 echo '10.0.0.11 docker01' 参考文档:https://m ...
- UVa 11728 Alternate Task (枚举)
题意:给定一个 n,求一个最大正整数 N 使得 N 的所有正因数和等于 n. 析:对于任何数一个 n,它的所有正因子都是大于等于本身的,因为 n 本身就是自己的正因数,这样的就可以直接暴力了,答案肯定 ...
- PowerShell工作流学习-1-嵌套工作流和嵌套函数
关键点: a)嵌套深度没有任何语法限制,但是嵌套三个层次的工作流不支持任何通用参数,包括工作流通用参数 b)嵌套工作流可以调用当前范围和任何父范围内的工作流和函数 c)工作流不允许递归调用,脚本和函数 ...
- ubuntu 14.04下搭建esp32开发环境
esp32是乐鑫出品的一款集成了wifi和蓝牙的集成模块,板上自带两个哈佛结构的Xtensa LX6 CPU双核处理器,本文主要讲解如何在linux下搭建其编译开发环境. 首先ctrl+alt+t打开 ...
- java数组-如何在一堆数据中使用数组!
数组 1.类型一致的一组数据,其实相当于集合概念. 数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成.其中,每一个数据称作一个数组元素(item),每个数组元素可以通过一个下标/索引来 ...
- 首页背景图片在PC端有显示,在手机端不显示的解决方法
今天看博客的资源大小,发现背景图片有44k大的吓人,准备压缩一下. 压缩之后才发现,我的背景图片在手机端是没有显示的.原因是背景图片不支持缩放. 上网查了下,发现加入如下代码之后就支持缩放了: bac ...
- Javascript百学不厌 - 尾递归
虽然偶尔也用过,但是从来没具体来整理过 普通递归: function fac(n) { ) ; ); } fac() 这是个阶乘.但是占用内存,因为: fac(5) (5*fac(4)) (5*(4* ...