Spring-IOC学习笔记-07基于注解开发

Posted Moon&&Dragon

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring-IOC学习笔记-07基于注解开发相关的知识,希望对你有一定的参考价值。

基于注解开发

好处:

  • 摆脱繁琐的xml文件的配置和属性注入

  • 可读性好,声明式的开发风格更符合中小型项目,很适合轻量级的开发

使用注解的前提,需要在配置文件中开启组件扫描

<!-- 需要导入xml头文件 -->
<context:component-scan base-package="com.moon">
    <!--排除不需要扫描的bean目录或者bean-->
    <context:exclude-filter type="regex" expression="com.moon.pojo.*"/>
</context:component-scan>

9.1 注解的分类

  • 根据 Bean的类型 分类:来标注和管理bean

    @Component : 组件注解,是一个通用注解,意思是交给IOC容器来管理

    @Repository : 一般标注在Dao层/持久层,也是把类交给IOC容器管理

    @Service : 标注在业务层/逻辑层

    @Controller : 在Web环境下标注在控制层/控制器类上

  • 根据如何 注入属性 来分类

    • 按照类型

      @Autowired 由IOC容器按照管理bean的类型去注入

      @Inject 基于JSR-330(java依赖注入标准的330号文件),也是通过类型去注入,需要额外引入依赖

    • 按名称

      @Named : 基于JSR-330(java依赖注入标准的330号文件),一般和Inject配合一起使用,也需要引入依赖

      @Qualifier : 和Autowired配合使用,通过name指定对应的bean

      @Resource : 基于JSR-250,先按照名称注入,如果没有再按照类型注入

  • 元数据注解: 辅助容器更好的管理bean

    @Primary : 主要用在根据类型装配的时候,ioc容器存在多个统一类型的Bean造成装配失败,标识当前的类为主要bean,在多个bean冲突的时候,会优先注入该类。

    @Repository
    @Primary
    public class GardenBabyCartoonDao implements CartoonDao{
     @Override
     public void rentCD() {
         System.out.println("我租到了花园宝宝的盘");
     }
    }
    

    @PostConstruct 相当于xml配置文件中的init-method的自定义初始化方法

    @PostConstruct
    public void annotationInit(){
    System.out.println("猛男爱看的动漫被初始化了");
    }
    

    @PreDestroy 相当于xml配置文件中的destroy-method的自定义销毁方法

    @PreDestroy
    public void annotationDestroy(){
    System.out.println("猛男爱看的动漫被销毁了");
    }
    

    @Scope 设定一个bean的作用域属性,默认的情况下是singlten,标识在类上

    @Service
    @Scope("prototype")
    public class CartoonService {}
    

    读取外部的配置文件

    user=root
    password=123
    

    在spring的配置中添加如下

    <!--让IOC容器读取外部文件-->
    <context:property-placeholder location="classpath:jdbc.properties"/>
    

    使用Value注解去换取配置文件的值

    @Value("${user}")
    private String url;
    
    @Value("${password}")
    private String password;
    

    @Value 为类中的属性注入静态数据,如果引用外部的数据,需要使用表达式${}填写key去获取Value。如果Value中填写正常字符串,则可以注入基本数据类型。

    @Value("lili")
    private String name;
    @Value("23")
    private int age;
    
  • 小结:多个同一类型的Bean根据类型装配(Autowired),会报错,那么就需要去指定一个bean去注入,这时候可以通过Qualifier注解去指定名字,或者使用直接使用Resource注解去指定name,也可以通过在Bean组件的类上加Primary注解来标识这个类为主要的类。

9.2 注解标记bean

在需要交给ioc管理的类的上面加管理bean的注解

@Component
public class DependencyA {}

默认的beanName是该类的首字母小写后的类名,在注解中可以输出值,输入的值就是beanName

@Component("A")
public class DependencyA {}

9.3 注解注入

注入的时候,是通过暴力反射,将属性直接赋值,并没有使用set方法,所以不会调用set方法

如果需要强行使用set方法,可以将注解放在set方法上

// 将注解放在set方法上,使用set注入
@Resource(name = "tigaCartoonDao")
public void setCartoonDao(TigaCartoonDao cartoonDao) {
  this.cartoonDao = cartoonDao;
}

注入引用属性

// 先通过type注入,如果有多个bean,通过name指定对应的bean
@Autowired
@Qualifier("tigaCartoonDao")
private TigaCartoonDao cartoonDao;
// 和上面的一样,但是需要导入额外的包
@Inject
@Named("tigaCartoonDao")
private TigaCartoonDao cartoonDao;
// 先通过类型注入,然后通过name注入,相当于上面俩个注解的结合,比较强大
// 这个是java的注解
@Resource(name = "tigaCartoonDao")
private TigaCartoonDao cartoonDao;

// 该注解也可以不给name值,直接通过类型注入
@Resource
private TigaCartoonDao cartoonDao;

// 通过属性的名字也可以指定对应的类型
@Resource
private CartoonDao gardenBabyCartoonDao;
// 如果设计的只有一个实现类,就可以通过一个自动注入的注解进行注入
@Autowired
private TigaCartoonDao cartoonDao;

9.4 上下文创建

和配置文件搭配使用的时候,还是使用的ClassPathXmlApplicationContext(),然后在构造器传入配置文件

需要注意的是,该方式,需要在配置文件中开启组件扫描

public class SpringAnnotationTest {
    public static void main(String[] args) {
      ApplicationContext context = new ClassPathXmlApplicationContext("config.xml");
       // 关闭容器
      ((ClassPathXmlApplicationContext)context).registerShutdownHook();
    }
}

使用注解的上下文,AnnotationConfigApplicationContext(),然后在构造器中传入需要扫描的包

该方式会去什么指定的包,不再需要配置文件

public class SpringAnnotationTest {
    public static void main(String[] args) {
      ApplicationContext context = new AnnotationConfigApplicationContext("com.moon.pojo");
      String[] beanDefinitionNames = context.getBeanDefinitionNames();
      for (String beanDefinitionName : beanDefinitionNames) {
        System.out.println(beanDefinitionName);
      }
    }
}

和java配置文件搭配使用,还是使用AnnotationConfigApplicationContext(),但是需要传入java配置文件类

在java配置文件中需要通过注解去开启扫描

以上是关于Spring-IOC学习笔记-07基于注解开发的主要内容,如果未能解决你的问题,请参考以下文章

在学习spring-IoC容器装配Bean_基于注解配置方式的时候,碰见的两个异常

在学习spring-IoC容器装配Bean_基于注解配置方式的时候,碰见的两个异常

Spring-IOC容器-Bean管理-基于注解方式详解

Spring-IOC学习笔记-02基于XML创建Bean

Spring-IOC学习笔记-03DI依赖注入

Spring-IOC学习笔记-04扩展命名空间