您的位置:首页 > 编程语言 > Java开发

Spring7——开发基于注解形式的spring

2020-06-26 15:22 337 查看

精选30+云产品,助力企业轻松上云!>>>

开发基于注解形式的spring SpringIOC容器的2种形式: (1)xml配置文件:applicationContext.xml; 存bean:<bean> 取bean:
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");

(2)注解:带有@Configuration注解的类(配置类)

存bean:@Bean+方法的返回值
//配置类,相当于applicationContext.xml
@Configuration
public class MyConfig {

@Bean //id=方法名(myStudent)
public Student myStudent(){
Student student=new Student(2,"fg",34);
return student;
}
}

取bean: 

ApplicationContext context=new AnnotationConfigApplicationContext(MyConfig.class);
Student myStudent = (Student) context.getBean("myStudent");
注意:两种形式获取的IOC是独立的   注解形式向IOC容器存放bean详解: 1.必须有@Configuration 2.形式: 2.1 三层组件(Controller、Service、Dao):             (1)将三层组件分别加注解@Controller、@Service、@Repository等价于@Commponent              (2)纳入扫描器 a.xml配置
<context:component-scan base-package="org.ghl.controller"></context:component-scan>
b.注解形式      component-scan只对三层组件负责。     给扫描器指定规则:                 过滤类型:FilterType(ANNOTATION, ASSIGNABLE_TYPE, CUSTOM)                 ANNOTATION:三层注解类型@Controller、@Service、@Repository等价于@Commponent
排除:
@ComponentScan(value = "org.ghl",excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION ,value = {Service.class,Repository.class})})
包含:(有默认行为,可以通过useDefaultFilters禁止)
@ComponentScan(value = "org.ghl",includeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION ,value = {Service.class,Repository.class})},useDefaultFilters = false)

  ASSIGNABLE_TYPE:指具体的类。

@ComponentScan(value = "org.ghl",includeFilters = {@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE ,value = {StudentController.class})},useDefaultFilters = false)
区分:ANNOTATION:Service.class指标有@Service的所有类;           ASSIGNABLE_TYPE:指具体的类。                 CUSTOM:自定义:自己定义规则
@ComponentScan(value = "org.ghl",includeFilters = {@ComponentScan.Filter(type = FilterType.CUSTOM ,value = {MyFilter.class})},useDefaultFilters = false)

 

public class MyFilter implements TypeFilter {
@Override
public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {
ClassMetadata classMetadata = metadataReader.getClassMetadata();
//拿到扫描器value = "org.ghl"包中的所有标有三层组件注解类的名字
String className = classMetadata.getClassName();
//只过滤出和student相关的三层组件
if (className.contains("Student")){
return true;  //表示包含
}
return false; //表示排除
}
}

  

2.2 非三层组件(Student.clss/转换器等): (1)@Bean+方法的返回值,id的默认值为方法名,也可以通过@Bean("stu")修改。 (2)import/FactoryBean   bean的作用域

(@Scope("singleton"))scope="singleton":单例 scope="prototype":原型、多实例。 执行的时机(产生bean的时机):         singleton:容器在初始化时,就创建对象,且只创建一次; 也支持延迟加载:在第一次使用时,创建对象。在config中加入@Lazy。         prototype:容器在初始化时,不创建对象,在每次使用时(每次从容器获取对象时),再创建对象。          条件注解 可以让某一个Bean在某些条件下加入IOC容器。 (1)准备bean; (2)增加条件bean:给每个bean设置条件,必须实现Condition接口。 (3)根据条件加入IOC容器   回顾给IOC加入Bean的方法:        注解:全部在@Configuration配置中设置:                 三层组件:扫描器+三层注解                 非三层组件:(1)@Bean+返回值                                      (2)@import                                      (3)FactoryBean(工厂Bean)   @import使用:         (1)直接编写到@Import中; @Import({Apple.class,Banana.class})         (2)自定义ImportSelector接口的实现类,通过selectimports方法实现(方法的返回值就是要纳入IOC容器的Bean)。并告知程序自己编写的实现类。
public class MyImportSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
return new String[]{"org.ghl.entity.Apple","org.ghl.entity.Banana"}; //方法的返回值就是要纳入IOC容器的Bean
}
}
@Import({MyImportSelector.class})

    (3)编写ImporBeanDefinitionRegistrar接口的实现类并重写方法。 

public class MyImporBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) {
//BeanDefinition beanDefinition=new RootBeanDefinition(Orange.class);
BeanDefinition beanDefinition=new RootBeanDefinition("org.ghl.entity.Orange");
beanDefinitionRegistry.registerBeanDefinition("myorange",beanDefinition);

}
}  
@Import({MyImporBeanDefinitionRegistrar.class})

  

FactoryBean(工厂Bean)         1.写实现类和重写方法;  
public class MyFactoryBean implements FactoryBean{
@Override
public Object getObject() throws Exception {
return new Apple();
}

@Override
public Class<?> getObjectType() {
return Apple.class;
}

@Override
public boolean isSingleton() {
return true;
}
}

  2.注册到@Bean中  

@Bean
public FactoryBean<Apple>  myFactoryBean(){
return new MyFactoryBean();
}

注意:需要通过&区分获取的对象是哪一个。不加&,获取的是最内部真实的apple,如果加&,获取的是FactoryBean。  

  

  

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spring entity prototype