创建对象
需要jar:spring-context,junit
创建一个实体类
public class Student {
public Student() {
}
public Student(Integer id, String name, String pass) {
this.id = id;
this.name = name;
this.pass = pass;
}
private Integer id;
private String name;
private String pass;
}
添加一个配置类
@Configuration
public class BeanConfig {
@Bean
public Student student() {
return new Student(1, "zhangsan", "123123");
}
}
添加一个测试类
@Test
public void test1() {
ApplicationContext ac = new AnnotationConfigApplicationContext(BeanConfig.class);
Student student = ac.getBean("student", Student.class); System.out.println(student);
}
自动扫描
扫描所有的包
@Configuration
@ComponentScan(basePackages = “com.znsd.annotation”)
public class BeanConfig {
}
排除某个包
@Configuration
@ComponentScan(basePackages = "com.znsd.annotation",
excludeFilters = {
@Filter(type = FilterType.ANNOTATION,classes = {Controller.class})
})
public class BeanConfig {
}
只扫描某个包
@Configuration
@ComponentScan(basePackages = "com.znsd.annotation",
includeFilters = {
@Filter(type = FilterType.ANNOTATION,classes = {Controller.class})
},useDefaultFilters = false)public class BeanConfig {
}
自定义排除规则
实现TypeFileter接口,重写typefileter的match方法
public class MyTypeFilter implements TypeFilter {
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();
if(className.contains("Service")) {
return true;
}
return false;
}
}
将过滤条件加入到扫描
@Configuration
@ComponentScan(basePackages = "com.znsd.annotation",includeFilters = {
@Filter(type = FilterType.CUSTOM,classes = {MyTypeFilter.class})
},useDefaultFilters = false)
public class BeanConfig {
}
修改对象的声明周期
需要jar:spring-webmvc
@Bean
@Scope("prototype")
public Student student() {
return new Student(1, "zhangsan", "123123");
}
懒加载
默认情况(单实例情况下)下我们Spring容器中的对象都是在Spring启动时创建对象
@Bean
@Lazy
public Student student() {
return new Student(1, "zhangsan", "123123");
}
@Conditional
Spring中提供了一种按照一定条件进行判断,满足条件给容器注册bean,否则就不进行注册。
如果是Windows就返回true
public class ConditionWindows implements Condition{
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
Environment em = context.getEnvironment();
if(em.getProperty("os.name").contains("Windows")) {
return true;
}
return false;
}
}
如果是Linux就返回true
public class ConditionLinux implements Condition{
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
Environment em = context.getEnvironment();
if(em.getProperty("os.name").contains("Linux")) {
return true;
}
return false;
}
}
@Configuration
public class BeanConfig {
@Bean
@Conditional(ConditionWindows.class)
public Student bill() {
return new Student(2,"windows","123123");
}
@Bean
@Conditional(ConditionLinux.class)
public Student linux() {
return new Student(2,"linux","123123");
}
}
判断容器中是否存在student,如果存在则创建bill。
public class ConditionStudent implements Condition{
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {BeanDefinitionRegistry registry = context.getRegistry();
if(registry.containsBeanDefinition("student")) {
return true;
}
return false;
}
}
@Configuration
public class BeanConfig {
@Bean
@Conditional({ConditionWindows.class, ConditionStudent.class})
public Student bill() {
return new Student(2,"bill","123123");
}
}
@Import
@Configuration
@Import({Color.class})
public class BeanConfig2 {
}
定义一些导入规则
ImportSelector
public class MyImportSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
return new String[]{"com.znsd.spring.entile.Student","com.znsd.spring.entile.Gread"};
}
}
@Configuration
@Import({ Student.class, Gread.class })
public class BeanConfig2 {
}
ImportBeanDefinitionRegistrar
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
if(registry.containsBeanDefinition("com.znsd.spring.dao.Student")){
RootBeanDefinition rbd=new RootBeanDefinition(Student.class);
registry.registerBeanDefinition("student",rbd);
}
}
}
@Configuration
@Import({ MyImportBeanDefinitionRegistrar.class})
public class BeanConfig2 {
}
FactoryBean
public class ColorFactoryBean implements FactoryBean<Color> {
public Color getObject() throws Exception {
return new Color();
}
public Class<Color> getObjectType() {
return Color.class;
}
public boolean isSingleton() {
return true;
}
}
@Configuration
public class BeanConfig2 {
@Bean
public ColorFactoryBean colorFactoryBean() {
return new ColorFactoryBean();
}
}
@Test
public void demo6(){
ApplicationContext ac1=new AnnotationConfigApplicationContext(BeanConfig.class);
ColorFactoryBean colorFactoryBean= ac1.getBean(ColorFactoryBean.class);
System.out.println(colorFactoryBean);
}
@Test
public void demo6(){
ApplicationContext ac1=new AnnotationConfigApplicationContext(BeanConfig.class);
Color color=(Color)ac1.getBean("ColorFactoryBean ");
System.out.println(color);
}