Spring的IOC注解开发(六)

17 篇文章 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:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">
</beans>
配置注解扫描

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

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

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

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

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

<!--Spring的注解开发:组件扫描,扫描需要使用注解的类包(类上注解:可以直接使用属性注入的注解)-->
<context:component-scan base-package="spring.demo"/>
<context:component-scan base-package="spring.demo1"/>

<!--使用逗号分隔,扫描多个包-->
<context:component-scan base-package="spring.demo,spring.demo1"/>

<!--扫描父包的形式,扫描父包下所有子包-->
<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容器中了:

@Component(value="dao")//等价于< bean id="dao" classpath="demo.DaoImpl"/>
public class DaoImpl implements Dao {

//    @Value("kk")
    private String name;

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

    @Override
    public void save() {
        System.out.println("save方法被调用了" + name);
    }
}

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

  • @Value 注解

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

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

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

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

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

@Value("kk")
String name;  

test测试的代码:

@Test
public void test1() {
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
    Dao dao = (Dao) applicationContext.getBean("dao");
    dao.save();
}

IOC注解的详解

@Component:组件

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

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

  • @Controller:web层

  • @Service :service层

  • @Repository:dao层

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

属性注入的注解

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

@Value(“kk”)
String name;

对象类型的值:

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

如:

@Service("userService")
public class UserServiceImpl implements UserService {

	@Autowired
    private Dao dao;

    @Override
    public void save() {
        System.out.println("service的save方法被调用了");
        dao.save();
    }
}

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

  • @Qualifier:与@Autowired注解搭配使用,可以按照名称完成属性注入
 @Autowired
 @Qualifier("dao")
 private Dao dao;
 
 @Override
    public void save() {
        System.out.println("service的save方法被调用了");
        dao.save();
    }

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

  • Resource:按照名称完成对象类型的属性注入
@Resource(name="dao")
private Dao dao;

@Override
public void save() {
    System.out.println("service的save方法被调用了");
    dao.save();
}

测试类test2如下:

@Test
//Spring的IOC的注解方式
public void test2() {
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
    UserService userService = (UserService) applicationContext.getBean("userService");
    userService.save();
}
Bean生命周期相关注解
  • @PostConstruct : 初始化方法注解(相当于bean标签的init-method)
@PostConstruct
public void init(){
     System.out.println("bean的初始化方法初始化了");
}
  • @PreDestroy : 销毁方法注解(相当于bean标签的destroy-method)
@PreDestroy
public void destroy(){
    System.out.println("bean的销毁方法初始化了");
}
bean作用范围的注解

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

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

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

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

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

IOC的XML和注解的整合开发

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

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

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

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

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

XML和注解的整合开发

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

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

而现在可以将两者结合,

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

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

< context:annotation-config/>

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

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

XML:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">
        
    <!--在没有扫描的情况下,使用属性注入的注解:@Resource,@Value,@Autowired,@Qualifier-->
    <context:annotation-config/>

    <bean name="OrderDao" class="springdemo.OrderDao"/>
    <bean name="ProductService" class="springdemo.ProductService"/>
    <bean name="ProductDao" class="springdemo.ProductDao"/>
</beans>

在相关类上的配置 ProductService:

package springdemo;

import javax.annotation.Resource;

public class ProductService {

	//只使用属性注入的注解,注入对象类型属性
    @Resource(name="OrderDao")
    private OrderDao orderDao;

    @Resource(name="ProductDao")
    private ProductDao ProductDao;


    public void save() {
        System.out.println("ProductService的save方法被调用了");
        orderDao.save();
        ProductDao.save();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值