基于注解的spring IOC

Posted by 好记性不如烂笔头 on 03-29,2020

IOC不仅可以通过在xml里写配置来实现,也可以通过注解的方式,它和xml里面的配置有着一样的效果。

使用注解的前提要在spring的xml配置文件中告知spring在创建容器时扫描的包,用到了context命名空间。

注解有:

  1. @Component:作用是把当前类放入spring IOC容器中,和<bean>标签效果是一样的。属性是value,用于指定bean的id,默认为当前类名的首字母小写。

  2. @Controller@Service@Repository:这三个注解的作用和属性与@Component完全一样,这三个是spring框架为我们提供明确的三层使用的注解,使我们的三层对象更清晰。

  3. @Autowired :作用是自动按照类型注入,只要容器中有唯一的一个bean对象类型和要注入的变量类型匹配,就可以注入成功。这个注解的出现位置可以是变量上,也可以是方法上。而且使用注解注入时,set方法就不是必须的了。内部原理如下:

  • spring会拿着@Autowired注解的变量的类去spring的class域中找有没有匹配的类名,如果有唯一的一个,那么就创建相应的对象,如果没有,那么就会报错;如果有多个匹配的,又会分为两种情况:
    • 如果要注入的变量名和spring的id域中有匹配,那么注入成功。
    • 如果变量名和id域也没有匹配的,那么注入失败报错。
  1. @Qualifier:作用是按照bean的id注入。它在给成员注入时不能单独使用,要和@Autowired配合使用,但是给方法参数注入时可以。属性有value,用于指定bean的id。

  2. @Resource:作用是直接按照bean的id注入,可以单独使用,属性有name用来指定id。

  3. @Value:作用是注入基本类型和String类型,因为以上三个注解都只能注入其他bean类型,另外复杂数据类型不能用注解注入,只能在xml写配置注入。这个注解需要用到${}这种表达式。

  4. @Scope:作用是指定bean的作用范围,value属性指定作用范围的取值,常用的取值有singleton,prototype。

  5. @PreDestroy:作用是指定销毁bean对象的方法。

  6. @PostConstruct:作用是指定初始化方法。

spring还可以不需要xml配置文件,这就需要建立一个配置类,用来代替xml。

  1. @Configuration:指定当前类是一个配置类。(如果该类是用于创建AnnotationConfigApplicationContext对象的参数,那么不加这个注解也可以)

  2. @ComponentScan:指定spring在创建容器时候要扫描的包,属性basePackages指定包名,等同于在xml中使用了context命名空间。

  3. @Bean:用于把配置类中的一个方法的返回值作为bean对象存入spring的IOC容器中,bean的类名为返回值类型,该注解的属性有:

    1. name:用来指定bean对象的id,缺省值为当前方法的名称。
  4. @Import:用于一个主配置类导入其他配置类,属性有value,用来指定其他配置类的字节码。

  5. @PropertySource:作用是指定properties文件的位置,属性有value,用于指定文件的路径和名称,比如value="classpath=a.property"。