Spring的IOC注解开发(六)

你的名字 2022-03-07 12:00 372阅读 0赞

引入Spring的配置文件

要使用IOC注解开发,除了需要引入基本的4个Spring jar包,2个日志jar包,在4.X以上的Spring版本,还需要引入 AOP jar包,因为有一部分的IOC方法被转移到AOP jar中,。如:

spring-aop-5.1.5.RELEASE.jar

同时,创建一个applicationContext.xml配置文件后,还需要引入Context约束

context约束:

xmlns:context=“http://www.springframework.org/schema/context”

http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd“

全部的约束如,applicationContext.xml:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans
  6. http://www.springframework.org/schema/beans/spring-beans.xsd
  7. http://www.springframework.org/schema/context
  8. http://www.springframework.org/schema/context/spring-context.xsd">
  9. </beans>

配置注解扫描

使用注解,还需要在applicationContext.xml文件中配置注解的组件扫描器,以便扫描包下的类所使用的注解。

扫描是为了扫描类上的注解

base-package:指定所需要扫描的包。

如果要扫描多个包,则需要添加多个< context:component-scan>标签,或者使用逗号(,)相隔。

或者可以扫描多个子包的父包,也能达到扫描多个包的目的

  1. <!--Spring的注解开发:组件扫描,扫描需要使用注解的类包(类上注解:可以直接使用属性注入的注解)-->
  2. <context:component-scan base-package="spring.demo"/>
  3. <context:component-scan base-package="spring.demo1"/>
  4. <!--使用逗号分隔,扫描多个包-->
  5. <context:component-scan base-package="spring.demo,spring.demo1"/>
  6. <!--扫描父包的形式,扫描父包下所有子包-->
  7. <context:component-scan base-package="spring"/>

扫描是为了扫描类上的注解,如果将xml方式和注解方式整合开发的时候,使用xml方式管理bean,使用注解注入属性。

这时候可以不用在xml中配置扫描器,可以使用 < context:annotation-config/> 标签

在没有扫描器的情况下,使用属性注入的注解:@Resource,@Value,@Autowired,@Qualifier

相关类中填加注解和属性注入

  • @Component 注解

@Component(value=“dao”) 或者 @Component(“dao”)

等价于< bean id=“dao” classpath=“demo.DaoImpl”/>

指明这个类已经被配置到Spring容器中了:

  1. @Component(value="dao")//等价于< bean id="dao" classpath="demo.DaoImpl"/>
  2. public class DaoImpl implements Dao {
  3. // @Value("kk")
  4. private String name;
  5. @Value("kk")
  6. public void setName(String name) {
  7. this.name = name;
  8. }
  9. @Override
  10. public void save() {
  11. System.out.println("save方法被调用了" + name);
  12. }
  13. }

而要在注解的类中添加属性注入,则需要用到

  • @Value 注解

@Value(“abc”) 或者 @Value(daoImpl)(注入对象属性)

注解方法:与xml配置方式不一样,可以不提供SetXXX()方法

属性如果有set方法,需要将属性注入的注解添加在set方法上:

  1. @Value("kk")
  2. public void setName(String name) {
  3. this.name = name;
  4. }

属性如果没有set方法,需要将属性注入的注解添加在属性上:

  1. @Value("kk")
  2. String name;

test测试的代码:

  1. @Test
  2. public void test1() {
  3. ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
  4. Dao dao = (Dao) applicationContext.getBean("dao");
  5. dao.save();
  6. }

IOC注解的详解

@Component:组件

修饰一个类,将这个类交给Spring管理,相当于xml方式的注册一个bean标签,将类托管到Spring容器中

这个注解有三个功能类似的衍生注解,用来修饰类

  • @Controller:web层
  • @Service :service层
  • @Repository:dao层

为了区分代码层次,它们分别用于项目的不同的层,

属性注入的注解

普通属性 :设置普通属性的值

@Value(“kk”)
String name;

对象类型的值:

  • @Autowired:设置对象类型的属性的值。但是单独使用的话,是按照类型完成属性的注入。
    也就是说是按照,实现类的类型(如:DaoImpl类型)来注入,而不是如XML中bean方式一样,是按照名称(如:name=“kk”)来寻找bean,完成注入的。

如:

  1. @Service("userService")
  2. public class UserServiceImpl implements UserService {
  3. @Autowired
  4. private Dao dao;
  5. @Override
  6. public void save() {
  7. System.out.println("service的save方法被调用了");
  8. dao.save();
  9. }
  10. }

而如果想要和bean方式一样,使用bean名称来指定注入属性的话,还需要搭配另外一个注解使用:

  • @Qualifier:与@Autowired注解搭配使用,可以按照名称完成属性注入

    @Autowired
    @Qualifier(“dao”)
    private Dao dao;

    @Override

    1. public void save() {
    2. System.out.println("service的save方法被调用了");
    3. dao.save();
    4. }

而除此之外,Spring还提供了一个注解,可以单独的按照名称完成属性的注入,强制性的按照名称注入,在日常中常用这种。

  • Resource:按照名称完成对象类型的属性注入

    @Resource(name=”dao”)
    private Dao dao;

    @Override
    public void save() {

    1. System.out.println("service的save方法被调用了");
    2. dao.save();

    }

测试类test2如下:

  1. @Test
  2. //Spring的IOC的注解方式
  3. public void test2() {
  4. ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
  5. UserService userService = (UserService) applicationContext.getBean("userService");
  6. userService.save();
  7. }
Bean生命周期相关注解
  • @PostConstruct : 初始化方法注解(相当于bean标签的init-method)

    @PostConstruct
    public void init(){

    1. System.out.println("bean的初始化方法初始化了");

    }

  • @PreDestroy : 销毁方法注解(相当于bean标签的destroy-method)

    @PreDestroy
    public void destroy(){

    1. System.out.println("bean的销毁方法初始化了");

    }

bean作用范围的注解

@Scope 注解:作用范围,注解在类上

@Scope(“singleton”) //:默认是单例范围

类型和bean标签中的作用范围是一致的

singleton(单例),prototype(多例模式,用于整合struts2框架),request,session,globalsession

  1. @Component(value="dao")//等价于< bean id="dao" classpath="demo.DaoImpl"/>
  2. @Scope("singleton")
  3. public class DaoImpl implements Dao {
  4. 。。。。
  5. }

IOC的XML和注解的整合开发

XML和注解的比较
  • 适用场景

    • XML:可以适用于任何场景

      类结构清晰,维护方便,但是需要配置xml文件比较繁琐

    • 注解:有些地方使用不了,比如当类不是自己提供的时候,无法修改别的类的源码,不能注入属性等

      开发方便,书写类的时候添加注解即可;维护麻烦,需要修改源码,而且对于类的结构不能一目了然。

XML和注解的整合开发

对于XML来说,用来管理Bean十分的方便,可以很清晰的看到类结构,也可以方便进行管理,但是对于类属性的注入,十分的麻烦。

而对于注解来说,管理Bean比较麻烦,需要修改源码,难以看清楚类的整体结构,但是对于属性注入,十分的方便。

而现在可以将两者结合,

XML管理Bean,注解完成属性注入。

那么使用xml管理bean,当没有在类上添加注解的时候,则可以不用配置扫描器,可以使用标签开启注解:,

< context:annotation-config/>

只对类属性上的注解生效。

PS:在配置文件中使用 context 命名空间之前,必须在 元素中声明 context 命名空间。也就是需要引入约束

XML:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans
  6. http://www.springframework.org/schema/beans/spring-beans.xsd
  7. http://www.springframework.org/schema/context
  8. http://www.springframework.org/schema/context/spring-context.xsd">
  9. <!--在没有扫描的情况下,使用属性注入的注解:@Resource,@Value,@Autowired,@Qualifier-->
  10. <context:annotation-config/>
  11. <bean name="OrderDao" class="springdemo.OrderDao"/>
  12. <bean name="ProductService" class="springdemo.ProductService"/>
  13. <bean name="ProductDao" class="springdemo.ProductDao"/>
  14. </beans>

在相关类上的配置 ProductService:

  1. package springdemo;
  2. import javax.annotation.Resource;
  3. public class ProductService {
  4. //只使用属性注入的注解,注入对象类型属性
  5. @Resource(name="OrderDao")
  6. private OrderDao orderDao;
  7. @Resource(name="ProductDao")
  8. private ProductDao ProductDao;
  9. public void save() {
  10. System.out.println("ProductService的save方法被调用了");
  11. orderDao.save();
  12. ProductDao.save();
  13. }
  14. }

发表评论

表情:
评论列表 (有 0 条评论,372人围观)

还没有评论,来说两句吧...

相关阅读