javaconfig
为什么要了解javaconfig?
springboot就是基于javaconfig.
什么是javaconfig
以java代码的方式管理bean
装逼时刻(spring历史)
spring1.x版本的时候,我们都是通过xml来配置比如在
applicationcontext.xml
<bean id="date" class="java.util.Date"></bean>
spring2.x版本的时候,添加了注解比如 @controller @service @Reponsitory @Component @Autowired
spring3.x-spring4.x 版本的时候 就有了 @Configuration 和 @Bean @Configuration 作用于类上,相当于一个xml配置文件;
@Bean 作用于方法上,相当于xml配置中的;
至此注解慢慢的取代了xml配置。
javaconfig操作
大家可以通过spring的测试来区别每个版本之间的具体区别
applicationcontext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="date" class="java.util.Date"></bean>
</beans>
spring1.x的操作
springtest方式一: new ClassPathXmlApplicationContext
public class Maintest {
@Test
public void test(){
ApplicationContext context =
new ClassPathXmlApplicationContext("applicationContext.xml");
String[] beanDefinitionNames = context.getBeanDefinitionNames();
for (String beanDefinitionName : beanDefinitionNames) {
System.out.println(beanDefinitionName);
}
}
}
springtest方式二: 注入 Runwith ContextConfigration
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationcontext-xml.xml")
public class Maintest {
@Autowired
private ApplicationContext applicationContext;
@Test
public void test2(){
String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames();
for (String beanDefinitionName : beanDefinitionNames) {
System.out.println(beanDefinitionName);
}
}
}
两种方法打印结果一致
spring2.x的操作与1.x的测试操作一致,但xml不一致,多了扫描组件,少了bean的手写,只需要在你要依赖注入的类上加注解,controller层@controller ,service层service,dao层@Component,
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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.xsd">
<context:component-scan base-package="cn.itsource._03iocanno_(你加入注解的包层)"></context:component-scan>
</beans>
spring3.x–spring4.x的操作完全不一样了,没有了xml
@Configuration
public class JavaConfig {
@Bean
public One one(){
return new One();
}
}
@Configration 代替了xml配置文件
@Bean 代替了
springtest变成了
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = JavaConfig.class)
public class Maintest {
@Autowired
private ApplicationContext applicationContext;
@Test
public void test(){
//方式一
ApplicationContext context =new AnnotationConfigApplicationContext(JavaConfig.class);
String[] beanDefinitionNames = context.getBeanDefinitionNames();
for (String beanDefinitionName : beanDefinitionNames) {
System.out.println(beanDefinitionName);
}
}
@Test
public void test2(){
String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames();
for (String beanDefinitionName : beanDefinitionNames) {
System.out.println(beanDefinitionName);
}
}
}
我们原来使用spring的时候不会在xml中一个一个配置bean,我们就在类上加上@Repository,@Service,@Controller @Component,并且注入时可以使用@AutoWired的注解注入。 现在这些都被包含在<context:component-scan base-package=“cn.itsource”/>.,它将扫描cn.itsource下面的所有spring注解;扫描多个的时候
@Configuration
//@ComponentScan("cn.itsource._05componentScan_")
//配置多个包
/*方式一
@ComponentScan("cn.itsource._05componentScan_.controller")
@ComponentScan("cn.itsource._05componentScan_.service")*/
/*方式二
@ComponentScans(value={@ComponentScan("cn.itsource._05componentScan_.controller"),
@ComponentScan("cn.itsource._05componentScan_.service") })*/
@ComponentScans(value = {
/*不包含某个包
@ComponentScan(value = "cn.itsource._05componentScan_",excludeFilters = {
@ComponentScan.Filter(type = FilterType.ANNOTATION,classes = {Controller.class})
})*/
//包含某个包
@ComponentScan(value = "cn.itsource._05componentScan_",includeFilters = {
@ComponentScan.Filter(type = FilterType.ANNOTATION,classes = {Service.class})
},useDefaultFilters = false)
})
Bean详情-@Scope 组件范围&@Lazy 懒加载-认识
@Conditional-按照条件注册
@Conditional(value = LinuxCondition.class) //放到类上面下面所有方法都生效,但是如果方法上加了优先级更高
public class MainConfig1 {
//相当于在xml中配置了<bean id="" class="cn.itsource.dao.UserDao"><bean/>
@Bean("userDao") //指定bean的名字
//@Scope(value = "protoType") //默认值为为单实例,默认值为是创建容器时就创建对象
@Lazy //只对单实例有用,表示创建容器时不创建对象,只有第一次使用时创建对象
public UserDao userDao01(){
return new UserDao();
}
@Bean
public UserDao userDaoLinux(){
return new UserDao();
}
//可以加到方法上面,也可以加到类上面. 根据当前os.name的环境来判断
@Bean
@Conditional(value = WindowsCondition.class)
public UserDao userDaoWindows(){
return new UserDao();
}
}
WindowsCondition.java
public class WindowsCondition
implements Condition {
/**
*
* @param context conditionContext条件上下文,可以获取一些信息,来判断是否条件
* @param annotatedTypeMetadata 当前方法或注解类的注解类型元数据信息
* @return
*/
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata annotatedTypeMetadata) {
//常用方法
//1 获取beanFactory
ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
//2 获取类家长群
ClassLoader classLoader = context.getClassLoader();
//3 获取当前运行环境
Environment environment = context.getEnvironment();
//4 获取bean的注册器,获取手动注册bean到spring容器
BeanDefinitionRegistry registry = context.getRegistry();
String osName = environment.getProperty("os.name");
return osName .contains("Windows");
}
}
LinuxCondition.java
public class LinuxCondition implements Condition {
@Override
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
//获取类加载器
ClassLoader classLoader = conditionContext.getClassLoader();
//获取spring容器
ConfigurableListableBeanFactory beanFactory = conditionContext.getBeanFactory();
//获取bean定义注册器
BeanDefinitionRegistry registry = conditionContext.getRegistry();
//获取环境
Environment environment = conditionContext.getEnvironment();
String property = environment.getProperty("os.name");
return property.contains("Linux");
}
}
@Import
@Configuration
@Import({GreenColor.class(类的权限类名),MySelect.class(导入选择器),MyRegistrar.class(bean定义注册器手动项目spring中容器中注册)})
public class JavaConfig {
@Bean
public PersonFactory person(){
return new PersonFactory();
}
}
public class PersonFactory implements FactoryBean<Person> {
@Override
public Person getObject() throws Exception {
return new Person();
}
@Override
public Class<?> getObjectType() {
return null;
}
@Override
public boolean isSingleton() {
return false;
}
}
springboot
一 创建项目
parent
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
</parent>
dependency
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
二 创建springboot项目并且启动
1)任意类加上@SpringBootApplication
2)Main函数启动springboot的应用
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class,args);
}
}
三 写一个Contorller来测试
@RestController
public class Mycontroller {
@RequestMapping("/hello")
public String hello(){
return "hello world";
}
}
运行app就可以在localhost:8080/hello上访问成功springboot项目了
打包
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
在target目录下查看jar
在jar当前路径打开cmd运行java -jar xxx.jar 就哦里给了