Spring IOC注解开发

╰半夏微凉° 2022-07-12 02:21 336阅读 0赞

Spring IOC注解开发

@(Spring)[Spring, ioc, 注解]

  • Spring IOC注解开发

    • Spring的IOC的注解使用步骤

      • 创建项目引入jar包
      • 引入配置文件
      • 创建相关包和类
      • 将类的控制权交给Spring容器
      • 编写测试
      • 依赖注入
    • Spring的IOC注解的详解

      • Bean定义注解
      • Bean依赖注入注解

        • Bean的作用范围的注解
        • Bean的生命周期注解
    • Spring的IOC的XML方式和注解方式比较

      • XML和注解的比较
    • contextcomponet-scan和contextannotation-config的区别

Spring的IOC的注解使用步骤

创建项目,引入jar包

这里写图片描述

引入配置文件

  • log4j.properties
  • applicationContext.xml
  1. * 引入一个context的约束
  2. <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">
  3. </beans>

创建相关包和类

  • 创建接口

    package com.pc.service;

    /* 用户服务类接口 @author Switch @data 2016年11月23日 @version V1.0 */
    public interface UserService {

    1. /** * 保存用户 */
    2. public void save();

    }

  • 创建实现类

    package com.pc.service.impl;

    /* 用户服务实现类 @author Switch @data 2016年11月23日 @version V1.0 */
    public class UserServiceImpl implements UserService {

    1. @Override
    2. public void save() {
    3. System.out.println("保存用户");
    4. }

    }

将类的控制权交给Spring容器

  • 在Spring中开启IOC的注解

  • 在类上添加注解

    package com.pc.service.impl;

    import org.springframework.stereotype.Service;

    import com.pc.service.UserService;

    /* 用户服务实现类 @author Switch @data 2016年11月23日 @version V1.0 */
    @Service(“userService”)
    public class UserServiceImpl implements UserService {

    1. @Override
    2. public void save() {
    3. System.out.println("保存用户");
    4. }

    }

编写测试

  1. package com.pc.test;
  2. import org.junit.Test;
  3. import org.junit.runner.RunWith;
  4. import org.springframework.test.context.ContextConfiguration;
  5. import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
  6. /** * SpringIOC注解测试 * * @author Switch * @data 2016年11月23日 * @version V1.0 */
  7. @RunWith(SpringJUnit4ClassRunner.class)
  8. @ContextConfiguration("classpath:applicationContext.xml")
  9. public class SpringIOCAnnotationTest {
  10. @Test
  11. public void test1() {
  12. }
  13. }

依赖注入

  1. package com.pc.test;
  2. import javax.annotation.Resource;
  3. import org.junit.Test;
  4. import org.junit.runner.RunWith;
  5. import org.springframework.test.context.ContextConfiguration;
  6. import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
  7. import com.pc.service.UserService;
  8. /** * SpringIOC注解测试 * * @author Switch * @data 2016年11月23日 * @version V1.0 */
  9. @RunWith(SpringJUnit4ClassRunner.class)
  10. @ContextConfiguration("classpath:applicationContext.xml")
  11. public class SpringIOCAnnotationTest {
  12. @Resource(name = "userService")
  13. private UserService userService;
  14. @Test
  15. public void test1() {
  16. userService.save();
  17. }
  18. }

如果属性有set方法,注解需要加到set方法上,如果没有set方法直接在属性上添加注解。

PS:如果不知道怎么配置Spring和junit单元测试集成,可以参考之前写的博客《Spring集成单元测试》

Spring的IOC注解的详解

Bean定义注解

原来需要使用XML配置的方式将id和类绑定,现在不需要这样做了只需要在类上添加注解即可。

  • @Component :组件
  1. * `@Controller` :修饰web层类
  2. * `@Service` :修饰业务层类
  3. * `@Repository` :修饰持久层类

@Component是Spring提供的通用的组件注解,可以通过在类上使用该注解,将对应的类标记为Spring Bean,使用此功能需要在Spring配置文件中,开启组件扫描,<context:component-scan base-package="包名"/>

@Component@Component("name")的区别在于,前者只能通过Spring的按类型注入依赖,后者还能使用按名注入依赖。

@Controller@Service@Repository这三个注解和@Component的功能在目前的4.x.x版本都是一样的,只是表明它是一个组件。不过通过在不同层使用相对应的注解,可以使注解更具有意义。在以后的版本中,Spring可能提供对这三个注解不同的增强。

  1. // 只能通过按类型注入
  2. // @Component
  3. // 可以按名注入
  4. @Service("userService")
  5. public class UserServiceImpl implements UserService {
  6. @Override
  7. public void save() {
  8. System.out.println("保存用户");
  9. }
  10. }

Bean依赖注入注解

如果属性有set方法,注解需要加到set方法上,如果没有set方法直接在属性上添加注解。

  1. @RunWith(SpringJUnit4ClassRunner.class)
  2. @ContextConfiguration("classpath:applicationContext.xml")
  3. public class SpringIOCAnnotationTest {
  4. // @Value("Switch")
  5. private String name;
  6. @Value("Switch")
  7. public void setName(String name) {
  8. this.name = name;
  9. }
  10. @Test
  11. public void test2() {
  12. System.out.println(name);
  13. }
  14. }

PS:如果同时在属性和set方法上添加了注解,那么set方法上的注解将会覆盖属性上的。

  • 普通类型的属性
  1. * `@Value` :注入普通类型属性
  2. @RunWith(SpringJUnit4ClassRunner.class)
  3. @ContextConfiguration("classpath:applicationContext.xml")
  4. public class SpringIOCAnnotationTest {
  5. @Value("Switch")
  6. private String name;
  7. @Test
  8. public void test2() {
  9. System.out.println(name);
  10. }
  11. }
  • 对象类型的属性
  1. * `@Resource` :注入对象类型
  2. * `@Autowired` :注入对象类型,默认按照类型注入。结合`@Qualifier`注解完成按名称的注入。
  3. * `@Qualifier`
  4. @RunWith(SpringJUnit4ClassRunner.class)
  5. @ContextConfiguration("classpath:applicationContext.xml")
  6. public class SpringIOCAnnotationTest {
  7. // 按bean类型注入
  8. // @Resource
  9. // 按名注入,需要组件设置名称
  10. // @Resource(name = "userService")
  11. // 和上面功能一样,按名注入
  12. @Qualifier("userService")
  13. @Autowired
  14. private UserService userService;
  15. @Test
  16. public void test1() {
  17. userService.save();
  18. }
  19. }

Bean的作用范围的注解

  • Bean的范围的注解:默认是单例的
  1. * `@Scope` :在类上添加的,控制类生成的时候采用单例还是多例。
  2. * 取值:
  3. * `singleton` :单例
  4. * `prototype` :多例
  5. * `request` request域,需要在web环境
  6. * `session` session域,需要在web环境
  7. * `application` context域,需要在web环境
  8. * `globalsession` 集群环境的session域,需要在web环境

PS:可以到WebApplicationContext接口和ConfigurableBeanFactory类中找到@Scope的取值。

Bean的生命周期注解

  • Bean的生命周期的注解
  1. * `@PostConstruct` :相当于init-method
  2. * `@PreDestroy` :相当于destroy-method
  3. @Service("userService")
  4. public class UserServiceImpl implements UserService {
  5. @Override
  6. public void save() {
  7. System.out.println("保存用户");
  8. }
  9. @PostConstruct
  10. public void init() {
  11. System.out.println("用户初始化");
  12. }
  13. @PreDestroy
  14. public void destory() {
  15. System.out.println("注销用户");
  16. }
  17. }

Spring的IOC的XML方式和注解方式比较

XML和注解的比较

这里写图片描述

context:componet-scan和context:annotation-config的区别

通过<context:annotation-config>的注释可以看出它的作用是激活
@Required@Autowired@PostConstruct@PreDestroy@Resource等注解。

通过<context:component-scan base-package="xx"/>的注释可以看出它除了激活了<context:annotation-config>中所有的注解,同时还激活了@Component@Repository@Service@Controller
@RestController@ControllerAdvice@Configuration 这些注解。

附上不错的关于 <context:component-scan>使用的博文,
context:component-scan使用说明

发表评论

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

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

相关阅读