Spring笔记之三----基于Annotation的Spring配置

  1. 使用Annotation 来创建Bean有两种方式

    • 配置类中创建bean(配置类是指标注为@Configuration的类),在配置类中每一个创建bean的方法都应该标注为@Bean,可以在@Bean 这个annotation中指定Bean name,如果没有指定,则默认使用方法的名字;
      注意在配置类中一个方法创建的Bean要引用另外一个方法创建的Bean,则直接调用方法即可;
    • 将Java类标注为 @Component,@Repository,@Service,@Controller中的任何一种;Bean name可以在这些Annotation的构造函数中指定,如果没有指定Bean name,Spring默认将Bean name设置为这个类名(小写首字母):
      • @Repository用于装饰持久化层;
      • @Service用于装饰服务层;
      • @Controller用于装饰控制层;
      • 如果某个类不适合上面任何一个,则用@Component装饰;

    无论采用以上的何种方法,我们都需要指示Spring IoC Container去Scan这些标注有Annotation的类,具体的方法有:

    • 如果你使用的是GenericXMLApplicationContext来创建上下文,那么你需要在XML配置文件中加上:
      <context:component-scan base-package="package name" /> 
      注意,<context:component-scan>会隐式的启用<context:annotation-config>;所以使用了<context:component-scan>就没必要指定<context:annotation-config>;你可以指定Scan的时候,排除或加入一些类,通过使用<context:component-scan>的<context:include-filter>和<context:exclude-filter>子节点;
    • 你还可以使用AnnotationConfigApplicationContext来创建上下文,其scan()方法允许你指定要scan的包;register()方法允许你指定要scan的类;
  2. 对于一个通过@Component,@Repository,@Service,@Controller中的一种来定义的Bean,如果它要autowire其他的Bean,则可以在这个bean的字段、setter方法、构造函数或者一个任意的的方法上加上@Autowired;使用@Autowired annotation要注意一下几点:
    • 默认情况下,所以标示为@Autowired的property都是Required的,如果Spring找不到一个匹配的bean,则会抛出一个异常;你可以将@Autowired的required属性设置为false;
    • 当@Autowired被使用到方法上,或者构造函数上,则Spring会Autowired这个方法或者构造函数所有的参数;
    • @Autowired默认是autowire by type
    • 如果@Autowired被使用在一个数组字段或者范型集合类型的字段上,则Spring会找到所有匹配类型的bean,并构造成数组或者集合,设置给该字段;
    • 如果@Autowired被设置给key类型为String的Map类型的字段上,则Spring会找到所有匹配类型的bean,并将这些bean的bean name作为key,插入到Map中;
    • 对于一个Autowire的字段,如果找到多个匹配类型的bean,则Spring会抛出异常;解决的办法有两种:
      • 在其中的某一个bean上标记@Primary annotation,表示如果找到多个匹配类型的bean,则这个bean将拥有最高优先级;
      • 在这个字段上加上@Qualifier annotation,指定要autowire的bean的名字;
  3. 如果一个配置类要引用到其它配置类中的bean,则可以在这个配置类上面加上@Import annotation去引用其他的配置类;
  4. Spring提供了@Scope Annotation去定义bean所在的scope,可以将其和@Bean,@Component,@Repository,@Service,@Controller一起使用;
  5. 为了引用一个Properties文件中的值,我们需要执行下面三个步骤:
    • 在配置类上加上@PropertySource annotation,并指定properties文件的位置;
    • 在配置类里创建类型为PropertySourcesPlaceholderConfigurer的bean;
    • 在完成了上面两个步骤后,我们就可以使用@Value("${key:default_value}")来引用properties文件中的property;
  6. 在Spring中,可以使用一个Resource来读取一个外部资源,我们只需要使用@Value将资源的地址以字符串的形式注入到一个Resource的字段中,Spring将使用预注册的ResourceEditor将这个字符串转化为一个Resource对象,并注入到这个字段中;

    注意:我们可以使用PropertiesLoaderUtils.loadProperties()方法将一个加载了properties文件的Resource对象转换为Properties对象;

  7. 为了支持多语言化,我们需要在配置文件中创建一个名为messageSource并且类型是ReloadableResourceBundleMessageSource的Bean,但是创建这个Bean的方法必须标示为static,因为ReloadableResourceBundleMessageSource是一个Bean Post Processor;
  8. 如果想在Spring Container中的每一个bean的初始化方法被调用之前或者之后执行一些任务,我们有两种方式:
    • 如果Bean是在配置文件中被创建的,那么我们可以通过设置@Bean annotation的initMethod和destoryMethod两个属性来实现;
    • 如果Bean不是在配置文件中被创建的,那么可以在Bean所在类中用@PostConstruct和@PreDestory来标示初始化方法和析构方法;
  9. 一般而言,spring context中的所有bean会在Spring Container被启动后立即执行初始化;为了避免某些过渡消耗时间和资源的bean的创建,我们可以将Bean所在的类标示上@Lazy annotation,或者在配置类中将Bean创建的方法标示上@Lazy annotation;
  10. 如果一个Bean的创建需要依赖自一个或者多个其他Bean的创建,我们需要使用@DependsOn annotation;
  11. 一个Bean post processor允许Spring Container在所有Bean的初始化方法被调用之前或者之后执行一些任务;比如@Required方法就是被Spring内置的一个Post-processor RequiredAnnotationBeanPostProcessor使用,用于判断Spring Container的所有bean中标示为@Required的属性都已经被设置了值;
    如果要创建一个自定义的Bean Post Processor,必须实现BeanPostProcessor接口,并实现两个方法:postProcessBeforeInitialization() and postProcessAfterInitialization(),并将该类标示为@Component annotation即可;

    注意:postProcessBeforeInitialization()和postProcessAfterInitialization()方法将传入的bean返回,或者返回一个与传入的bean相同类型的实例;

  12. 如果我们要定义多个Profile,我们需要为每一个Profile创建一个配置类,然后将配置类标注上@Profile annotation,在Profile的构造函数里面可以指定一个或者多个Profile name;
    为了从正确的Profile去加载beans,我们需要激活一个或者多个profile,正确的做法是在AnnotationConfigApplicationContext scan某个包之前,调用AnnotationConfigApplicationContext.getEnvironment.setActiveProfiles()方法,你也可以设置默认是的Profile,做法是调用AnnotationConfigApplicationContext.getEnvironment.setDefaultProfiles()方法;
时间: 2024-10-10 03:34:30

Spring笔记之三----基于Annotation的Spring配置的相关文章

【学习】Spring 的 AOP :基于Annotation 的“零配置”方式

转自:http://www.cnblogs.com/jbelial/archive/2012/07/20/2539123.html AOP(Aspect Orient Programming ) , 面向切面编程 . 1.AOP的基本概念: AOP框架并不与特定的代码耦合,AOP框架能处理程序执行中特定的切入点(Pointcut),而不与具体某个类耦合.AOP框架具有如下特征: 1.各步骤之间的良好隔离性. 2.源代码无关性. AOP的专业术语: 1.Aspect(切面) : 应用运行过程中的关

Spring学习笔记之一----基于XML的Spring IOC配置

1. 在spring配置文件中,如果对一个property进行直接赋值,可使用<value>元素,spring负责将值转化为property指定的类型:也可以直接在property元素上使用value属性来赋值: 2. 构造函数注入,应使用<constructor-arg>元素来赋值,该元素有三个属性,你可以指定来对赋值的构造函数参数进行区分:type.index或者name,但是当你使用name属性时,你应该放置@ConstructorProperties annotation到

详解 Spring 3.0 基于 Annotation 的依赖注入实现(转)

使用 @Repository.@Service.@Controller 和 @Component 将类标识为 Bean Spring 自 2.0 版本开始,陆续引入了一些注解用于简化 Spring 的开发.@Repository 注解便属于最先引入的一批,它用于将数据访问层 (DAO 层 ) 的类标识为 Spring Bean.具体只需将该注解标注在 DAO 类上即可.同时,为了让 Spring 能够扫描类路径中的类并识别出 @Repository 注解,需要在 XML 配置文件中启用 Bean

spring国际化,基于数据库的信息配置

之前在做spring国际化的时候,资源文件都是写在properties里面,管理起来不是很方便,今天我将这些资源文件都保存在数据库中,启动的时候进行初始化操作,从而进行多语言的管理.这里记录下过程: 其他的操作还是跟之前一样,这里就不多解释了,直接贴上对应的配置或者代码信息.使用spring框架,我这里用了两个配置文件,一个是springmvc.xm,另一个是spring-framework.xml文件,主要是想分开进行配置. 国际化配置在spring-webmvc这个jar的org.sprin

详解 Spring 3.0 基于 Annotation 的依赖注入实现--转载

使用 @Repository.@Service.@Controller 和 @Component 将类标识为 Bean Spring 自 2.0 版本开始,陆续引入了一些注解用于简化 Spring 的开发.@Repository 注解便属于最先引入的一批,它用于将数据访问层 (DAO 层 ) 的类标识为 Spring Bean.具体只需将该注解标注在 DAO 类上即可.同时,为了让 Spring 能够扫描类路径中的类并识别出 @Repository 注解,需要在 XML 配置文件中启用 Bean

详解 Spring 3.0 基于 Annotation 的依赖注入实现

使用 @Repository.@Service.@Controller 和 @Component 将类标识为 Bean Spring 自 2.0 版本开始,陆续引入了一些注解用于简化 Spring 的开发.@Repository 注解便属于最先引入的一批,它用于将数据访问层 (DAO 层 ) 的类标识为 Spring Bean.具体只需将该注解标注在 DAO 类上即可.同时,为了让 Spring 能够扫描类路径中的类并识别出 @Repository 注解,需要在 XML 配置文件中启用 Bean

spring笔记--通过注解(annotation)配置Bean

Spring能够在classpath下自动扫描,侦测和实例化具有特定注解的组件,这在Spring中成为组件扫描(Component scanning). 特定组件的注解包括: @Component:基本注解,标识了一个受spring管理的组件.   @Repository:标识持久层组件 @Service:标识服务层(业务层)组件 @Controller:标识表现层组件 对于扫描上的组件,Spring有默认的命名策略,使用非限定类名,第一个字母小写,也可以在注解中通过value属性值表示组件的名

Spring(3.2.3) - Beans(8): 基于 Annotation 的配置

除了基于 XML 的配置外,Spring 也支持基于 Annotation 的配置.Spring 提供以下介个 Annotation 来标注 Spring Bean: @Component:标注一个普通的 Spring Bean @Controller:标注一个控制器组件类 @Service:标注一个业务逻辑组件类 @Repository:标注一个 DAO 组件类 基于 Annotation 配置的示例 DAO 组件以 @Repository 标注: public interface UserD

[译]17-spring基于java代码的配置元数据

spring还支持基于java代码的配置元数据.不过这种方式不太常用,但是还有一些人使用.所以还是很有必要介绍一下. spring基于java代码的配置元数据,可以通过@Configuration注解把一个声明为配置类;通过@Bean注解把一个新 创建的类交由spring容器来管理.在这种配置方式下,我们可以手动装配bean,也可以自动装配bean.我感觉在这种 方式下使用手动装配非常不爽,尤其是有多个配置类的时候. 下面看个例子: 1.新建包com.tutorialspoint.javacod