一、多环境切换
开发中如何在 开发、生产、测试环境之间进行快速切换
spring Profile(底层是条件注解)
package org.kk2.ioc;
import org.springframework.stereotype.Service;
/**
* @program: ioc01
* @description:
* @author: zjx
* @create: 2021-12-27 20:01
**/
public class DataSource {
private String url;
private String username;
private String password;
@Override
public String toString() {
return "DataSource{" +
"url='" + url + '\'' +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
//开发环境DataSource
@Bean("ds")
@Profile("dev")
DataSource devDs()
{
DataSource ds = new DataSource();
ds.setUrl("jdbc:mysql:///vhr");
ds.setUsername("root");
ds.setPassword("123456");
return ds;
}
//开发环境DataSource
@Bean("ds")
@Profile("prod")
DataSource prodDs()
{
DataSource ds=new DataSource();
ds.setUrl("jdbc://192.168.23.56:3306/vhr");
ds.setUsername("root");
ds.setPassword("123");
return ds;
}
public class Main {
public static void main(String[] args) {
AnnotationConfigApplicationContext context=new AnnotationConfigApplicationContext();
//设置完环境信息再注册 .class
context.getEnvironment().setActiveProfiles("dev");
context.register(JavaConfig.class);
context.refresh();
DataSource ds=(DataSource) context.getBean("ds");
System.out.println("ds="+ds);
}
二、Bean的作用域
Spring 容器中多次获取同一个Bean,默认情况下是同一个实例。
JavaConfig中也可以配置非单例:
@Bean
@Scope(""prototype)
三、混合配置
配置类
@Configuration
@ImportResource(“classpath:applicationContext.xml”)注解 可以导入一个XML配置
四、Aware接口——获取容器的信息
如果在方法中需要获取容器的信息,打印容器信息等…可以继承Aware这个接口,然后设置个私有变量,通过继承获取这个变量,在我们的方法中使用它。
package org.kk2.ioc;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.context.EnvironmentAware;
import org.springframework.context.ResourceLoaderAware;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.stereotype.Service;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/**
* @program: ioc01
* @description:Aware里面提供了一些与容器相关的东西,交给变量来管理
* @author: zjx
* @create: 2021-12-27 21:11
**/
//实现这些接口就能获取容器信息
@Service
@PropertySource(value = "javaboy.properties")
public class AwareService implements BeanNameAware, BeanFactoryAware, ResourceLoaderAware, EnvironmentAware {
private String beanName;
private ResourceLoader resourceLoader;
private Environment environment;
/**
* @Description: 获取bean的生成工厂
* @Param: [beanFactory]
* @return: void
* @Author: zjx
* @Date: 2021/12/27
*/
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
}
/**
* @Description: 获取Bean的名字
* @Param: [s]
* @return: void
* @Author: zjx
* @Date: 2021/12/27
*/
@Override
public void setBeanName(String s) {
this.beanName=s;
}
/**
* @Description: 获取环境信息
* @Param: [environment]
* @return: void
* @Author: zjx
* @Date: 2021/12/27
*/
@Override
public void setEnvironment(Environment environment) {
this.environment=environment;
}
/**
* @Description: 获取
* @Param: [resourceLoader]
* @return: void
* @Author: zjx
* @Date: 2021/12/27
*/
@Override
public void setResourceLoader(ResourceLoader resourceLoader) {
this.resourceLoader=resourceLoader;
}
public void output() throws IOException {
System.out.println("beanName="+beanName);
Resource resource = resourceLoader.getResource("jvaboy.txt");
BufferedReader br=new BufferedReader(new InputStreamReader(resource.getInputStream()));
String s=br.readLine();
System.out.println("s="+s);
br.close();
String address = environment.getProperty("javaboy.address");
System.out.println("address"+address);
}
}
@Configuration
@ComponentScan
public class JavaConfig2 {
}
@Test
public void testAware() throws IOException {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(JavaConfig2.class);
AwareService bean = context.getBean(AwareService.class);
bean.output();
}