开发基于注解形式的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。  

  

  

Spring7——开发基于注解形式的spring的更多相关文章

  1. 使用 Spring 2.5 基于注解驱动的 Spring MVC

    http://www.ibm.com/developerworks/cn/java/j-lo-spring25-mvc/ 概述 继 Spring 2.0 对 Spring MVC 进行重大升级后,Sp ...

  2. 使用 Spring 2.5 基于注解驱动的 Spring MVC--转

    概述 继 Spring 2.0 对 Spring MVC 进行重大升级后,Spring 2.5 又为 Spring MVC 引入了注解驱动功能.现在你无须让 Controller 继承任何接口,无需在 ...

  3. mybatis基于注解形式的多数据源

    最近在做一个系统管理项目,需要使用到多数据源,尝试了注解形式和xml形式的多数据源配置,以下是基于注解形式的Mybatis多数据源配置. 1.application.yml 配置文件 database ...

  4. Spring7:基于注解的Spring MVC(下篇)

    Model 上一篇文章<Spring6:基于注解的Spring MVC(上篇)>,讲了Spring MVC环境搭建.@RequestMapping以及参数绑定,这是Spring MVC中最 ...

  5. 基于注解配置的Spring MVC 简单的HelloWorld实例应用

    2.1 问题 使用注解的方式重构helloworld应用案例. 2.2 方案 1. @RequestMapping注解应用 @RequestMapping可以用在类定义和方法定义上,它标明这个类或方法 ...

  6. Spring MVC 中的基于注解的 Controller【转】

    原文地址:http://my.oschina.net/abian/blog/128028 终于来到了基于注解的 Spring MVC 了.之前我们所讲到的 handler,需要根据 url 并通过 H ...

  7. Spring MVC中基于注解的 Controller

         终于来到了基于注解的 Spring MVC 了.之前我们所讲到的 handler,需要根据 url 并通过 HandlerMapping 来映射出相应的 handler 并调用相应的方法以响 ...

  8. Spring MVC 中的基于注解的 Controller(转载)

           终于来到了基于注解的 Spring MVC 了.之前我们所讲到的 handler,需要根据 url 并通过 HandlerMapping 来映射出相应的 handler 并调用相应的方法 ...

  9. spring mvc 基于注解的使用总结

    本文转自http://blog.csdn.net/lufeng20/article/details/7598801 概述 继 Spring 2.0 对 Spring MVC 进行重大升级后,Sprin ...

随机推荐

  1. 前后端分离,如何在前端项目中动态插入后端API基地址?(in docker)

    开门见山,本文分享前后端分离,容器化前端项目时动态插入后端API基地址,这是一个很赞的实践,解决了前端项目容器化过程中受制后端调用的尴尬. 尴尬从何而来 常见的web前后端分离:前后端分开部署,前端项 ...

  2. Java实现 LeetCode 521 最长特殊序列 Ⅰ(出题人:“就是喜欢看你们不敢相信那么简单,又不敢提交的样子。”)

    521. 最长特殊序列 Ⅰ 给定两个字符串,你需要从这两个字符串中找出最长的特殊序列.最长特殊序列定义如下:该序列为某字符串独有的最长子序列(即不能是其他字符串的子序列). 子序列可以通过删去字符串中 ...

  3. Java实现 LeetCode 423 从英文中重建数字

    423. 从英文中重建数字 给定一个非空字符串,其中包含字母顺序打乱的英文单词表示的数字0-9.按升序输出原始的数字. 注意: 输入只包含小写英文字母. 输入保证合法并可以转换为原始的数字,这意味着像 ...

  4. Java实现 LeetCode 92 反转链表 II

    92. 反转链表 II 反转从位置 m 到 n 的链表.请使用一趟扫描完成反转. 说明: 1 ≤ m ≤ n ≤ 链表长度. 示例: 输入: 1->2->3->4->5-> ...

  5. Volcano火山:容器与批量计算的碰撞

    [摘要] Volcano是基于Kubernetes构建的一个通用批量计算系统,它弥补了Kubernetes在“高性能应用”方面的不足,支持TensorFlow.Spark.MindSpore等多个领域 ...

  6. 更多的bash shell命令

    1.探查进程:ps 2.实时监控进程:top 3.结束进程:kill.killall 4.查看挂载媒体:mount 5.移除设备:nmount 6.查看已挂载设备的使用情况:df 7.显示特定磁盘的使 ...

  7. html中隐藏域hidden

    基本语法: <input type="hidden" name="field_name" value="value"> 作用: ...

  8. Android 图片裁剪踩坑

      今天做图库图片的裁剪遇到了不少坑,今天记录一下,以下坑位供各位看官参考: 如果有不对之处,欢迎各位看官留言评论! 图片裁剪踩坑锦囊: 问题一:相册裁剪权限问题 解:这个简单,对于Android6. ...

  9. Serval and Parenthesis Sequence【思维】

    Serval and Parenthesis Sequence 题目链接(点击) Serval soon said goodbye to Japari kindergarten, and began ...

  10. 2019-02-03 线性表的顺序储存结构C语言实现

    #include<cstdio> #define MAXSIZE 20 typedef int Elemtype; //Elemtype类型根据实际情况而定,这里取int typedef ...