1-1.传统xml方式
< beans>
< bean id = " user" class = " com.futao.springmvcdemo.model.entity.User" >
< property name = " address" value = " 杭州" />
</ bean>
</ beans>
@Test
public void test ( ) {
ClassPathXmlApplicationContext applicationContext =
new ClassPathXmlApplicationContext ( "applicationContext.xml" ) ;
User user = ( User) applicationContext. getBean ( "user" ) ;
System. out. println ( user) ;
}
1-2.注解方式
@Configuration
class SpringConfig {
@Bean
public User user ( ) {
User user = new User ( ) ;
user. setAddress ( "上海" ) ;
return user;
}
}
@Test
public void test1 ( ) {
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext ( SpringConfig. class ) ;
String[ ] beanNamesForType = applicationContext. getBeanNamesForType ( User. class ) ;
for ( String s : beanNamesForType) {
System. out. println ( s) ;
}
}
2-1. 传统xml方式扫描bean
< context: component-scan base-package = " com.futao.springmvcdemo" />
2-2. 注解方式扫描bean
@ComponentScan ( value = "com.futao.springmvcdemo" ,
excludeFilters = {
@ComponentScan . Filter ( type = FilterType. ANNOTATION, classes = { Controller. class , Service. class } )
} ,
useDefaultFilters = false ,
includeFilters = {
@ComponentScan . Filter ( type = FilterType. ANNOTATION, classes = { Repository. class , Component. class } )
}
)
class SpringConfig {
}
@Scope
如果为singleton
(默认)则在容器启动的时候加载这个bean。
如果为prototype
,则在使用的时候再创建
# @Conditional条件注解
public class UserCondition implements Condition {
@Override
public boolean matches ( ConditionContext context, AnnotatedTypeMetadata metadata) {
String osName = context. getEnvironment ( ) . getProperty ( "os.name" ) ;
return "Mac OS X" . equals ( osName) ;
}
}
@Conditional ( UserCondition. class )
@Bean
public User user ( ) {
return new User ( ) ;
}
3. 通过@Import导入bean
快速导入一个组件,直接写需要导入的类.class
@Import ( { User. class , Address. class } )
@Configuration
@ComponentScan ( value = "com.futao.springmvcdemo.test" )
class SpringConfig {
}
通过ImportSelector添加指定全类名的bean到容器中
@Import ( { User. class , MyImportSelector. class } )
@Configuration
@ComponentScan ( value = "com.futao.springmvcdemo.test" )
class SpringConfig {
}
class MyImportSelector implements ImportSelector {
@Override
public String[ ] selectImports ( AnnotationMetadata importingClassMetadata) {
return new String [ ] { "com.futao.springmvcdemo.model.entity.Article" , "com.futao.springmvcdemo.model.entity.Order" } ;
}
}
通过ImportBeanDefinitionRegistrar手动将bean注册到容器中
class MyImportBeanDefinitionRegister implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions ( AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
if ( ! registry. containsBeanDefinition ( "user" ) ) {
System. out. println ( "registerBeanDefinitions执行了...." ) ;
registry. registerBeanDefinition ( "user" , new RootBeanDefinition ( User. class ) ) ;
}
}
}
@Import ( { MyImportBeanDefinitionRegister. class } )
# 4. 通过FactoryBean注册bean
class UserFactoryBean implements FactoryBean < User> {
@Override
public User getObject ( ) throws Exception {
return new User ( ) ;
}
@Override
public Class< ? > getObjectType ( ) {
return User. class ;
}
@Override
public boolean isSingleton ( ) {
return true ;
}
}
@Bean
public UserFactoryBean userFactoryBean ( ) {
return new UserFactoryBean ( ) ;
}
Object bean = applicationContext. getBean ( "userFactoryBean" ) ;
System. out. println ( bean. getClass ( ) ) ;
>> class com. futao. springmvcdemo. model. entity. User
Object bean1 = applicationContext. getBean ( "&userFactoryBean" ) ;
System. out. println ( bean1. getClass ( ) ) ;
>> class com. futao. springmvcdemo. test. UserFactoryBean