开发基于注解形式的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. NET-NTLM hash传递

    net-ntlm无法进行hash直接传递,通过responder等中继器拿到的net-ntlm破解也很难,所以利用responder加MultiRelay获取一直存在的shell. 注意的一点是: N ...

  2. Blazor WebAssembly 修仙之途 - 组件与数据绑定

    一.前言 在第一篇文章中,有提到过组件(Component)这个概念.组件在 Blazor 中是必不可少的,UI 全靠它组装起来,和前端的 JS 组件是一个意思,比如:vue component.re ...

  3. leetcode56之合并区间

    题目描述: 给出一个区间的集合,请合并所有重叠的区间. 示例: 输入: [[1,3],[2,6],[8,10],[15,18]]输出: [[1,6],[8,10],[15,18]]解释: 区间 [1, ...

  4. 最好用的FTP工具,最好用的FTP工具推荐!

    IIS7服务器管理工具是一个良好的FTP的客户端,可以进行FTP的操作!同时,还可以作为VNC的客户端进行VNC的相关操作!它还能连接Windows和Linux的服务器和PC,并对他们的连接状态进行实 ...

  5. Alpha冲刺 —— 5.5

    这个作业属于哪个课程 软件工程 这个作业要求在哪里 团队作业第五次--Alpha冲刺 这个作业的目标 Alpha冲刺 作业正文 正文 github链接 项目地址 其他参考文献 无 一.会议内容 1.展 ...

  6. SQL server 常用的数据库 DDL语言

    use (数据库名) //切换到目标数据库 if exists (select * from sysdatabases where name='数据库名') //如果括号里面是查看有没有这个数据库 d ...

  7. 第八届蓝桥杯JavaC组省赛真题

    解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.外星日历 题目描述 某星系深处发现了文明遗迹. 他们的计数也是用十进制. 他们的文明也有日历.日历只有天数,没有年.月的概念. 有趣的 ...

  8. java实现显示为树形

    ** 显示为树形** 树形结构应用十分广泛. 下面这段代码根据用户添加的数据,在内存中构建一个逻辑上等价的树形结构. 通过ShowTree() 可以把它显示为控制中的样子. 其中: a.add('a' ...

  9. Java实现 蓝桥杯 历届试题 波动数列

    问题描述 观察这个数列: 1 3 0 2 -1 1 -2 - 这个数列中后一项总是比前一项增加2或者减少3. 栋栋对这种数列很好奇,他想知道长度为 n 和为 s 而且后一项总是比前一项增加a或者减少b ...

  10. 关于64位W7下怎么学习汇编语言的一些心得!

    出处:http://tieba.baidu.com/p/2277546332 1.首先下载DOSBOX,它的作用就是让你在64位下使用32.16位的软件.如果不使用DOSBOX就会出现程序不兼容的对话 ...