Spring 注解开发之注册组件
1、@Configuration & @Bean
Spring xml配置(在resources目录下配置一个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" >
< bean id = " person" class = " com.atguigu.bean.Person" >
< property name = " age" value = " 18" > </ property>
< property name = " name" value = " zhangsan" > </ property>
</ bean>
</ beans>
调用方法:
public class MainTest {
public static void main ( String[ ] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext ( "beans.xml" ) ;
Person bean = ( Person) applicationContext. getBean ( "person" ) ;
System. out. println ( bean) ;
}
}
Spring 注解配置
创建一个配置类(创建MainConfig配置类)
@Configuration
public class MainConfig {
@Bean ( "person" )
public Person person01 ( ) {
return new Person ( "lisi" , 20 ) ;
}
}
调用方法:
public class MainTest {
@SuppressWarnings ( "resource" )
public static void main ( String[ ] args) {
ApplicationContext applicationContext = new AnnotationConfigApplicationContext ( MainConfig. class ) ;
Person bean = applicationContext. getBean ( Person. class ) ;
System. out. println ( bean) ;
String[ ] namesForType = applicationContext. getBeanNamesForType ( Person. class ) ;
for ( String name : namesForType) {
System. out. println ( name) ;
}
}
}
2、@ComponentScan
Spring xml配置(在resources目录下配置一个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>
</ beans>
spring 注解配置
@Configuration
@ComponentScans (
value = {
@ComponentScan ( value= "com.atguigu" , includeFilters = {
@Filter ( type= FilterType. CUSTOM, classes= { MyTypeFilter. class } )
} , useDefaultFilters = false )
}
)
public class MainConfig {
@Bean ( "person" )
public Person person01 ( ) {
return new Person ( "lisi" , 20 ) ;
}
}
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 ;
}
}
3、@Scope & @Lazy
Spring 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" >
< bean id = " person" class = " com.atguigu.bean.Person" scope = " prototype" lazy-init = " true" >
< property name = " age" value = " 18" > </ property>
< property name = " name" value = " zhangsan" > </ property>
</ bean>
</ beans>
Spring 注解配置:
@Configuration
public class MainConfig2 {
@Lazy
@Bean ( "person" )
public Person person ( ) {
System. out. println ( "给容器中添加Person...." ) ;
return new Person ( "张三" , 25 ) ;
}
}
4、@Conditional
Spring 注解配置:
@Conditional ( { WindowsCondition. class } )
@Configuration
public class MainConfig2 {
@Bean ( "bill" )
@Conditional ( { WindowsCondition. class } )
public Person person01 ( ) {
return new Person ( "Bill Gates" , 62 ) ;
}
@Conditional ( LinuxCondition. class )
@Bean ( "linus" )
public Person person02 ( ) {
return new Person ( "linus" , 48 ) ;
}
}
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 ;
}
}
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 ;
}
}
调用方法:
@Test
public void test03 ( ) {
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext ( MainConfig2. class ) ;
String[ ] namesForType = applicationContext. getBeanNamesForType ( Person. class ) ;
ConfigurableEnvironment environment = applicationContext. getEnvironment ( ) ;
String property = environment. getProperty ( "os.name" ) ;
System. out. println ( property) ;
for ( String name : namesForType) {
System. out. println ( name) ;
}
Map< String, Person> persons = applicationContext. getBeansOfType ( Person. class ) ;
System. out. println ( persons) ;
}
5、@Import
spring 注解配置:
@Configuration
@Import ( { Color. class , Red. class , MyImportSelector. class , MyImportBeanDefinitionRegistrar. class } )
public class MainConfig2 {
@Bean
public ColorFactoryBean colorFactoryBean ( ) {
return new ColorFactoryBean ( ) ;
}
}
public class MyImportSelector implements ImportSelector {
@Override
public String[ ] selectImports ( AnnotationMetadata importingClassMetadata) {
return new String [ ] { "com.atguigu.bean.Blue" , "com.atguigu.bean.Yellow" } ;
}
}
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 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 true ;
}
}
调用方法:
@Test
public void testImport ( ) {
printBeans ( applicationContext) ;
Blue bean = applicationContext. getBean ( Blue. class ) ;
System. out. println ( bean) ;
Object bean2 = applicationContext. getBean ( "colorFactoryBean" ) ;
Object bean3 = applicationContext. getBean ( "colorFactoryBean" ) ;
System. out. println ( "bean的类型:" + bean2. getClass ( ) ) ;
System. out. println ( bean2 == bean3) ;
Object bean4 = applicationContext. getBean ( "&colorFactoryBean" ) ;
System. out. println ( bean4. getClass ( ) ) ;