首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring-IOC实现【02-其他实现方式】

Spring-IOC实现【02-其他实现方式】

作者头像
用户4919348
发布2019-04-02 11:42:57
5020
发布2019-04-02 11:42:57
举报
文章被收录于专栏:波波烤鸭波波烤鸭

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());
}
在这里插入图片描述
在这里插入图片描述

@Resource和@Autowired的区别

注解

区别

@Resource

1.默认根据name注入对象2.jdk提供的注解

@Autowired

2.只能根据类型注入对象2.spring框架提供的注解3.需要根据name注入对象需要和@Qualifier一块使用

扫描特殊配置

	<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());
	}
profile条件是 Linux
profile条件是 Linux
在这里插入图片描述
在这里插入图片描述

Bean的作用域

作用域

说明

prototype

每次请求,都是一个新的Bean( java原型模式 )

singleton

bean是单例的(Java单例模式)

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.测试

在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年01月13日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Java配置方式
    • 1. 创建java项目
      • 2. 引入相关jar包
        • 3. 创建实体类
          • 4. 创建配置文件类
            • 5. 测试调用
            • 自动配置
              • xml文件配置
                • 1. 需要在application.xml文件中开启注解扫描
                • 2. java对象中添加对应的注解
                • 3. 测试
              • 简单案例
                • 1.创建项目
                • 2.创建dao层
                • 3.创建service层
                • 4.创建controller层
                • 5.配置文件中添加扫描
                • 6.注解使用
                • 7.测试
              • java代码配置
                • 1. Java配置类添加扫描注解
                • 2. JavaBean添加对应的注解
                • 3. 测试
            • profile
              • Java配置实现
                • 1. 创建实体类
                • 2. 修改java配置类
                • 3. 测试切换
              • XML配置
                • 1. 创建相关Bean
                • 2. 在xml配置中配置bean
                • 3.测试数据
            • 条件注解
              • 1.创建接口
                • 2.创建接口的实现类
                  • 3.定义条件Condition
                    • 4.java配置文件
                      • 5.测试调用
                      • Bean的作用域
                        • java配置文件中
                          • application.xml配置文件中
                          • 混合配置
                            • 1.添加application.xml文件
                              • 2.java配置文件
                                • 3.测试
                                领券
                                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档