参考了尚硅谷注解版,注解版后面的源码没看,雷神讲的太散了
Spring注解 AnnotationConfigApplicationContext 组件添加 @Configuration+@Bean XML文件方式 Person public class Person { private String name; private Integer age; private String nickName; public String getNickName () { return nickName; } public void setNickName (String nickName) { this .nickName = nickName; } public String getName () { return name; } public void setName (String name) { this .name = name; } public Integer getAge () { return age; } public void setAge (Integer age) { this .age = age; } public Person (String name, Integer age) { super (); this .name = name; this .age = age; } public Person () { super (); } @Override public String toString () { return "Person [name=" + name + ", age=" + age + ", nickName=" + nickName + "]" ; } }
beans.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" xmlns:context ="http://www.springframework.org/schema/context" xmlns:aop ="http://www.springframework.org/schema/aop" xmlns:tx ="http://www.springframework.org/schema/tx" 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 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd" > <context:component-scan base-package ="com.atguigu" use-default-filters ="false" > </context:component-scan > <bean id ="person" class ="com.atguigu.bean.Person" > <property name ="age" value ="18" > </property > <property name ="name" value ="zhangsan" > </property > </bean > </beans >
MainTest public class MainTest { @SuppressWarnings("resource") public static void main (String[] args) { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml" ); Person bean = (Person) applicationContext.getBean("person" ); System.out.println(bean); } }
输出
Person [name=zhangsan, age=18, nickName=null]
注解方式 @Configuration public class MainConfig { @Bean public Person person01 () { return new Person("lisi" , 20 ); } }
或者以下面的这种方式
@Configuration public class MainConfig { @Bean("person") public Person person01 () { return new Person("lisi" , 20 ); } }
@ComponentScans @Configuration @ComponentScans( value = { @ComponentScan(value="com.atguigu",includeFilters = { /* @Filter(type=FilterType.ANNOTATION,classes={Controller.class}), @Filter(type=FilterType.ASSIGNABLE_TYPE,classes={BookService.class}),*/ @Filter(type=FilterType.CUSTOM,classes={MyTypeFilter.class}) },useDefaultFilters = false) } ) public class MainConfig { @Bean("person") public Person person01 () { return new Person("lisi" , 20 ); } }
自定义TypeFilter指定包扫描规则 public class MyTypeFilter implements TypeFilter { @Override public boolean match (MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException { AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata(); ClassMetadata classMetadata = metadataReader.getClassMetadata(); Resource resource = metadataReader.getResource(); String className = classMetadata.getClassName(); System.out.println("--->" +className); if (className.contains("er" )){ return true ; } return false ; } }
@Scope @Configuration public class MainConfig2 { @Scope("prototype") @Lazy @Bean("person") public Person person () { System.out.println("给容器中添加Person...." ); return new Person("张三" , 25 ); } }
@Lazy @Configuration public class MainConfig2 { @Lazy @Bean("person") public Person person () { System.out.println("给容器中添加Person...." ); return new Person("张三" , 25 ); }
@Conditional MainConfig2 @Conditional({WindowsCondition.class}) @Configuration public class MainConfig2 { @Bean("bill") public Person person01 () { return new Person("Bill Gates" ,62 ); } @Conditional(LinuxCondition.class) @Bean("linus") public Person person02 () { return new Person("linus" , 48 ); } }
LinuxCondition public class LinuxCondition implements Condition { @Override public boolean matches (ConditionContext context, AnnotatedTypeMetadata metadata) { ConfigurableListableBeanFactory beanFactory = context.getBeanFactory(); ClassLoader classLoader = context.getClassLoader(); Environment environment = context.getEnvironment(); BeanDefinitionRegistry registry = context.getRegistry(); String property = environment.getProperty("os.name" ); boolean definition = registry.containsBeanDefinition("person" ); if (property.contains("linux" )){ return true ; } return false ; }
WindowsCondition public class WindowsCondition implements Condition { @Override public boolean matches (ConditionContext context, AnnotatedTypeMetadata metadata) { Environment environment = context.getEnvironment(); String property = environment.getProperty("os.name" ); if (property.contains("Windows" )){ return true ; } return false ; } }
@Import MainConfig2 @Configuration @Import({Color.class,Red.class,MyImportSelector.class,MyImportBeanDefinitionRegistrar.class}) public class MainConfig2 { @Bean public ColorFactoryBean colorFactoryBean () { return new ColorFactoryBean(); } }
MyImportSelector public class MyImportSelector implements ImportSelector { @Override public String[] selectImports(AnnotationMetadata importingClassMetadata) { return new String[]{"com.atguigu.bean.Blue" ,"com.atguigu.bean.Yellow" }; } }
MyImportBeanDefinitionRegistrar public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar { @Override public void registerBeanDefinitions (AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) { boolean definition = registry.containsBeanDefinition("com.atguigu.bean.Red" ); boolean definition2 = registry.containsBeanDefinition("com.atguigu.bean.Blue" ); if (definition && definition2){ RootBeanDefinition beanDefinition = new RootBeanDefinition(RainBow.class); registry.registerBeanDefinition("rainBow" , beanDefinition); } } }
public class Color { private Car car; public Car getCar () { return car; } public void setCar (Car car) { this .car = car; } @Override public String toString () { return "Color [car=" + car + "]" ; } }
public class Blue { public Blue () { System.out.println("blue...constructor" ); } public void init () { System.out.println("blue...init..." ); } public void detory () { System.out.println("blue...detory..." ); } }
FactoryBean MainConfig2 @Configuration public class MainConfig2 { @Bean public ColorFactoryBean colorFactoryBean () { return new ColorFactoryBean(); } }
ColorFactoryBean public class ColorFactoryBean implements FactoryBean <Color > { @Override public Color getObject () throws Exception { System.out.println("ColorFactoryBean...getObject..." ); return new Color(); } @Override public Class<?> getObjectType() { return Color.class; } @Override public boolean isSingleton () { return false ; } }
IOCTest public class IOCTest { AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig2.class); @Test public void testImport () { printBeans(applicationContext); Blue bean = applicationContext.getBean(Blue.class); System.out.println(bean); Object bean2 = applicationContext.getBean("colorFactoryBean" ); System.out.println("bean的类型:" +bean2.getClass()); Object bean4 = applicationContext.getBean("&colorFactoryBean" ); System.out.println(bean4.getClass()); } private void printBeans (AnnotationConfigApplicationContext applicationContext) { String[] definitionNames = applicationContext.getBeanDefinitionNames(); for (String name : definitionNames) { System.out.println(name); } } }
输出:
colorFactoryBean ColorFactoryBean...getObject... bean的类型:class com .atguigu .bean .Color class com .atguigu .bean .ColorFactoryBean
生命周期 @Bean指定初始化和销毁方法 IOCTest_LifeCycle
后面的几个用的都是这个测试类
public class IOCTest_LifeCycle { @Test public void test01 () { AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfLifeCycle.class); System.out.println("容器创建完成..." ); applicationContext.close(); } }
MainConfigOfLifeCycle package com.atguigu.config;import org.springframework.context.ApplicationListener;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.Scope;import com.atguigu.bean.Car;@ComponentScan("com.atguigu.bean") @Configuration public class MainConfigOfLifeCycle { @Bean(initMethod="init",destroyMethod="detory") public Car car () { return new Car(); } }
@Component public class Car { public Car () { System.out.println("car constructor..." ); } public void init () { System.out.println("car ... init..." ); } public void detory () { System.out.println("car ... detory..." ); } }
输出 car constructor... car ... init... 容器创建完成 car ... detory...
InitializingBean和DisposableBean MainConfigOfLifeCycle @ComponentScan("com.atguigu.bean") @Configuration public class MainConfigOfLifeCycle { @Bean(initMethod="init",destroyMethod="detory") public Car car () { return new Car(); } }
Cat @Component public class Cat implements InitializingBean ,DisposableBean { public Cat () { System.out.println("cat constructor..." ); } @Override public void destroy () throws Exception { System.out.println("cat...destroy..." ); } @Override public void afterPropertiesSet () throws Exception { System.out.println("cat...afterPropertiesSet..." ); } }
输出 cat constructor... cat...afterPropertiesSet... car constructor... car ... init... 容器创建完成 car ... detory... cat...destroy...
@PostConstruct和@PreDestroy MainConfigOfLifeCycle @ComponentScan("com.atguigu.bean") @Configuration public class MainConfigOfLifeCycle { @Bean(initMethod="init",destroyMethod="detory") public Car car () { return new Car(); } }
Dog @Component public class Dog implements ApplicationContextAware { private ApplicationContext applicationContext; public Dog () { System.out.println("dog constructor..." ); } @PostConstruct public void init () { System.out.println("Dog....@PostConstruct..." ); } @PreDestroy public void detory () { System.out.println("Dog....@PreDestroy..." ); } @Override public void setApplicationContext (ApplicationContext applicationContext) throws BeansException { this .applicationContext = applicationContext; } }
输出 cat constructor... cat...afterPropertiesSet... dog constructor... Dog....@PostConstruct ... car constructor... car ... init... 容器创建完成 car ... detory... Dog....@PreDestroy ... cat...destroy...
BeanPostProcessor @ComponentScan("com.atguigu.bean") @Configuration public class MainConfigOfLifeCycle { @Bean(initMethod="init",destroyMethod="detory") public Car car () { return new Car(); } }
MyBeanPostProcessor @Component public class MyBeanPostProcessor implements BeanPostProcessor { @Override public Object postProcessBeforeInitialization (Object bean, String beanName) throws BeansException { System.out.println("postProcessBeforeInitialization..." +beanName+"=>" +bean); return bean; } @Override public Object postProcessAfterInitialization (Object bean, String beanName) throws BeansException { System.out.println("postProcessAfterInitialization..." +beanName+"=>" +bean); return bean; } }
输出
自己写的组件输出内容
car constructor... postProcessBeforeInitialization...car=>com.atguigu.bean.Car@5ef60048 car ... init... postProcessAfterInitialization...car=>com.atguigu.bean.Car@5ef60048 cat constructor... postProcessBeforeInitialization...cat=>com.atguigu.bean.Cat@780cb77 cat...afterPropertiesSet... postProcessAfterInitialization...cat=>com.atguigu.bean.Cat@780cb77 dog constructor... postProcessBeforeInitialization...dog=>com.atguigu.bean.Dog@4034c28c Dog....@PostConstruct ... postProcessAfterInitialization...dog=>com.atguigu.bean.Dog@4034c28c 容器创建完成... Dog....@PreDestroy ... cat...destroy... car ... detory...
BeanPostProcessor在Spring源码里大量被使用到,仅凭这里雷丰阳老师讲的一点点原理,是无法体会的,建议自己去看看Spring源码。所以这里的原理部分我也就直接省略了,在本视频中讲的太浅了。
属性赋值 @Value和@PropertySource Person public class Person { @Value("张三") private String name; @Value("#{20-2}") private Integer age; @Value("${person.nickName}") private String nickName; public String getNickName () { return nickName; } public void setNickName (String nickName) { this .nickName = nickName; } public String getName () { return name; } public void setName (String name) { this .name = name; } public Integer getAge () { return age; } public void setAge (Integer age) { this .age = age; } public Person (String name, Integer age) { super (); this .name = name; this .age = age; } public Person () { super (); } @Override public String toString () { return "Person [name=" + name + ", age=" + age + ", nickName=" + nickName + "]" ; } }
person.properties person.nickName=\u5C0F\u674E\u56DB
MainConfigOfPropertyValues @PropertySource(value={"classpath:/person.properties"}) @Configuration public class MainConfigOfPropertyValues { @Bean public Person person () { return new Person(); } }
IOCTest_PropertyValue public class IOCTest_PropertyValue { AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfPropertyValues.class); @Test public void test01 () { printBeans(applicationContext); System.out.println("=============" ); Person person = (Person) applicationContext.getBean("person" ); System.out.println(person); ConfigurableEnvironment environment = applicationContext.getEnvironment(); String property = environment.getProperty("person.nickName" ); System.out.println(property); applicationContext.close(); } private void printBeans (AnnotationConfigApplicationContext applicationContext) { String[] definitionNames = applicationContext.getBeanDefinitionNames(); for (String name : definitionNames) { System.out.println(name); } } }
输出 mainConfigOfPropertyValues person ============= Person [name=张三, age=18 , nickName=小李四] 小李四
自动装配 @Autowired-@Qualifier-@Primary-@Resource-@Inject @Controller public class BookController { @Autowired private BookService bookService; }
@Service public class BookService { @Inject private BookDao bookDao; public void print () { System.out.println(bookDao); } @Override public String toString () { return "BookService [bookDao=" + bookDao + "]" ; } }
@Repository public class BookDao { private String lable = "1" ; public String getLable () { return lable; } public void setLable (String lable) { this .lable = lable; } @Override public String toString () { return "BookDao [lable=" + lable + "]" ; } }
MainConifgOfAutowired @Configuration @ComponentScan({"com.atguigu.service","com.atguigu.dao", "com.atguigu.controller","com.atguigu.bean"}) public class MainConifgOfAutowired { @Primary @Bean("bookDao2") public BookDao bookDao () { BookDao bookDao = new BookDao(); bookDao.setLable("2" ); return bookDao; } @Bean public Color color (Car car) { Color color = new Color(); color.setCar(car); return color; } }
IOCTest_Autowired public class IOCTest_Autowired { @Test public void test01 () { AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConifgOfAutowired.class); BookService bookService = applicationContext.getBean(BookService.class); System.out.println(bookService); Boss boss = applicationContext.getBean(Boss.class); System.out.println(boss); Car car = applicationContext.getBean(Car.class); System.out.println(car); Color color = applicationContext.getBean(Color.class); System.out.println(color); System.out.println(applicationContext); applicationContext.close(); } }
@Profle MainConfigOfProfile @PropertySource("classpath:/dbconfig.properties") @Configuration public class MainConfigOfProfile implements EmbeddedValueResolverAware { @Value("${db.user}") private String user; private StringValueResolver valueResolver; private String driverClass; @Bean public Yellow yellow () { return new Yellow(); } @Profile("test") @Bean("testDataSource") public DataSource dataSourceTest (@Value("${db.password}") String pwd) throws Exception { ComboPooledDataSource dataSource = new ComboPooledDataSource(); dataSource.setUser(user); dataSource.setPassword(pwd); dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/test" ); dataSource.setDriverClass(driverClass); return dataSource; } @Profile("dev") @Bean("devDataSource") public DataSource dataSourceDev (@Value("${db.password}") String pwd) throws Exception { ComboPooledDataSource dataSource = new ComboPooledDataSource(); dataSource.setUser(user); dataSource.setPassword(pwd); dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/ssm_crud" ); dataSource.setDriverClass(driverClass); return dataSource; } @Profile("prod") @Bean("prodDataSource") public DataSource dataSourceProd (@Value("${db.password}") String pwd) throws Exception { ComboPooledDataSource dataSource = new ComboPooledDataSource(); dataSource.setUser(user); dataSource.setPassword(pwd); dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/scw_0515" ); dataSource.setDriverClass(driverClass); return dataSource; } @Override public void setEmbeddedValueResolver (StringValueResolver resolver) { this .valueResolver = resolver; driverClass = valueResolver.resolveStringValue("${db.driverClass}" ); } }
dbconfig.properties db.user =root db.password =123456 db.driverClass =com.mysql.jdbc.Driver