1.javaconfig
1.1什么是javaconfig
以java代码的方式管理bean
出现在spring3.x-4.x之间
1.2为什么学javaconfig
springboot的原理基于spring中的javaconfig
1.3测试spring的几种方式
1.直接new
new:ClassPathXmlApplicationContext
2.注入
Runwith ContextConfigration
1.4 1.x xml 2.x
1.xml
bean id=“myDate” class=“java.util.Date”
2.注解
1.打注解:三大注解都是一个特殊Component
2.扫描注解:<context:component-scan base-package="cn.itsource._03iocanno_">
</context:component-scan>
1.5 javaconfig
1.基本用法
@Configration 代替了xml配置文件
@Bean 代替了
2.bean扫描(@ComponentScan/ComponentScans)
1.单包
@ComponentScan("cn.itsource._05componentScan")
2.多包
@ComponentScans(value = {
@ComponentScan("cn.itsource._05componentScan.service"),
@ComponentScan("cn.itsource._05componentScan.controller")
})
3.排除或包含
@ComponentScans(value = {
//这是哪些不要
@ComponentScan(value = "cn.itsource._05componentScan",excludeFilters = {
//排除加了Controller注解的Bean
@ComponentScan.Filter(type = FilterType.ANNOTATION,classes = {Controller.class})
}),
//只要该包的这些
@ComponentScan(value = "cn.itsource._05componentScan",includeFilters = {
@ComponentScan.Filter(type = FilterType.ANNOTATION,classes = {Service.class})
},
useDefaultFilters = false//关闭默认全部扫描includeFilters才生效
)
})
3.bean的详情
1.@Scope
@Bean("mybean")//配置名称
2.@Lazy
@Scope("prototype") //singleton单例(默认值) prototype多例
3.注入方式 4种
方式一:创建对象直接设置值,没有在spring中,不注入
OtherBean otherBean = new OtherBean();
MyBean myBean = new MyBean();
myBean.setOtherBean(otherBean);
return myBean;
方式二:直接调方法
MyBean myBean = new MyBean();
// 智能发现如果已经通过该方法注册了bean,直接注入就ok,不会再新创建一个了。
myBean.setOtherBean(otherBean());
return myBean;
方式三:对注入的bean 进行设置值
MyBean myBean = new MyBean();
myBean.setOtherBean(otherBean);
return myBean;
方式四 通过构造函数进行注入 推荐使用
@Bean
public MyBean yyy(OtherBean otherBean){
return new MyBean(otherBean);
}
4.condition 条件注册
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
//matches匹配 如果是true表示注册,否则不注册
//获取类加载器
ClassLoader classLoader = conditionContext.getClassLoader();
//获取spring容器
ConfigurableListableBeanFactory beanFactory = conditionContext.getBeanFactory();
//获取bean定义注册器
BeanDefinitionRegistry registry = conditionContext.getRegistry();
//获取环境
Environment environment = conditionContext.getEnvironment();
String osName=environment.getProperty("os.name");
System.out.println(osName);
return osName.contains("Linux");
}
//按照条件来注册bean,区分操作系统 windows linux
@Configuration
@Conditional(value = WindowsCondition.class)//提升为类级别
public class MainConfig {
@Bean //windows
public MyBean myBeanForWindows(){
return new MyBean();
}
@Bean//Linux 继承父类的条件并且共存
@Conditional(value = LinuxCondition.class)
public MyBean myBeanForLinux(){
return new MyBean();
}
}
5.import
1.直接类(前面两个是直接类,后面的是selector和registrar)
@Import({
One.class,Tow.class,MyImportSelector.class,MyImportBeanDefinitionRegistrar.class
})
2.selector
public class MyImportSelector implements ImportSelector {
//你要注册类全限定名数组
public String[] selectImports(AnnotationMetadata annotationMetadata) {
//可以做逻辑处理
return new String[]{"cn.itsource._08import.Tree"};
}
}
3.Registar
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) {
beanDefinitionRegistry.registerBeanDefinition("for",new RootBeanDefinition(For.class));
}
6.factorybean
public class PersonFactoryBean implements FactoryBean<Person> {
public Person getObject() throws Exception {
return new Person();
}
public Class<?> getObjectType() {
return Person.class;
}
public boolean isSingleton() {
return true;
}
}
public class MainConfig {
//直接通过bean名称获取的是Factorybean所创建的对象而不是PersonFactoryBean
//如果想要获取PersonFactoryBean,通过&name
@Bean
public PersonFactoryBean person(){
return new PersonFactoryBean();
}
2.springboot
1.配置文件导包
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
2.任意类加上@SpringBootApplication
@SpringBootApplication//标识为一个springboot项目
3.启动应用
//启动一个应用
SpringApplication.run(类名.class,args);
4.添加打包插件
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
5.打包
6.运行
在当前项目目录下输入cmd,然后在控制面版输入
java -jar xxx.jar
7.注意:
要扫描的类必须在当前包或者子孙包中