当前位置: 首页 > article >正文

Spring注解开发详解

学习基于注解的 IOC 配置,大家脑海里首先得有一个认知,即注解配置和 xml 配置要实现的功能都是一样的,都是要降低程序间的耦合。只是配置的形式不一样。 关于实际的开发中到底使用xml还是注解,每家公司有着不同的使用习惯 , 所以这两种配置方式我们都需要掌握。

一、注解开发定义bean

注解说明
@Component使用在类上用于实例化Bean
@Controller使用在web层类上用于实例化Bean
@Service使用在service层类上用于实例化Bean
@Repository使用在dao层类上用于实例化Bean

1、Spring 2.5版本

注意:
在2.5版本中使用注解进行开发时,需要在application.xml中配置组件扫描,作用是指定哪个包及其子包下的Bean需要进行扫描以便识别使用注解配置的类、字段和方法。
在这里插入图片描述

1.1、使用Component定义bean

//dao层接口
public interface UserDao {
    void show();
}

//dao层实现类
@Component //通过类型定义bean(只有一个实现类建议使用)
// @Component("ud") //通过id定义bean
public class UserDaoImpl implements UserDao {
    @Override
    public void show() {
        System.out.println("这是userDao的方法");
    }
}

1.2、核心配置文件中通过组件扫描加载bean

<context:component-scan base-package="com.liming"/>

1.3、Spring提供@Component注解的三个衍生注解

// 持久层
@Repository
public class UserDaoImpl implements UserDao {
    @Override
    public void show() {
        System.out.println("这是userDao的方法");
    }
}

// 业务层
@Service
public class UserServiceImpl implements UserService {
    @Override
    public void show() {
        System.out.println("这是userDao的方法");
    }
}

// 表现层
@Controller
public class UserController {
}

1.4、XML与注解配置的对应关系
在这里插入图片描述

2、纯注解开发(Spring 3.0版本)

Spring 3.0 开启了纯注解开发模式,使用Java类替代配置文件,开启了Spring快速开发赛道

注解说明
@Configuration用于指定当前类是一个 Spring 配置类,当创建容器时会从该类上加载注解,作用等价于applicationContext.xml 配置文件。
@ComponentScan用于指定 Spring在初始化容器时要扫描的包。 作用和在 Spring 的 xml 配置文件中的 <context:component-scan base-package=“com.liming”/>一样

2.1、Java类代替Spring核心配置文件
在这里插入图片描述

2.2、初始化容器对象

读取Spring核心配置文件初始化容器对象切换为读取Java配置类初始化容器对象

ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);

二、依赖注入

注解说明
@Value注入简单类型
@Autowired自动按照类型注入。当使用注解注入属性时,set 方法可以省略。它只能注入其他 bean 类型。当有多个类型匹配时,使用要注入的对象变量名称作为 bean 的 id,在 spring 容器查找,找到了也可以注入成功。找不到就报错。 如果IOC容器当中有多个接口得实现类, 首先根据类型自动装配, 然后再根据名称自动装配。
@Qualifier结合@Autowired一起使用用于根据名称进行依赖注入
@Resource相当于@Autowired+@Qualifier,按照名称进行注入,是java提供的,不是框架提供的

2.1、使用@Autowired注解开启自动装配模式(按类型)

//@Component
@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserDao userDao;

    @Override
    public void show() {
        userDao.show();
    }
}

在这里插入图片描述
2.2、使用@Qualifier注解开启指定名称装配bean

//@Component
@Service
public class UserServiceImpl implements UserService {

    @Autowired
    @Qualifier("ud")
    private UserDao userDao;

    @Override
    public void show() {
        userDao.show();
    }
}

注意:@Qualifier注解无法单独使用,必须配合@Autowired注解使用

2.3、使用@Resource注解开启指定名称装配bean

//@Component
@Service
public class UserServiceImpl implements UserService {

    @Resource(name = "ud")
    private UserDao userDao;

    @Override
    public void show() {
        userDao.show();
    }
}

2.4、使用@Value注解注入普通类型

@Repository
public class UserDaoImpl implements UserDao {
    @Value("字符串")
    private String str;
    public void addUser() {
        System.out.println(str);
    }
}

三、加载properties文件

注解说明
@PropertySource用于加载xxx.properties 文件中的配置 结合@Value(“${}”) 取配置文件的值。
@Configuration
@ComponentScan("com.liming")
@PropertySource("classpath:jdbc.properties")
public class SpringConfig {
}

注意:路径仅支持单一文件配置,多文件请使用数组格式配置,不允许使用通配符*

四、第三方bean管理

4.1、使用独立的配置类管理第三方bean

在这里插入图片描述

4.2、将独立的配置类加入核心配置

注解说明
@Import用于导入其他配置类

在这里插入图片描述
注意:此注解只能添加一次,多个数据请用数组格式

五、第三方bean依赖注入

5.1、简单类型依赖注入
在这里插入图片描述

5.1、引用类型依赖注入

在这里插入图片描述

注意:引用类型注入只需要为bean定义方法设置形参即可,容器会根据类型自动装配对象

六、生命周期注解

注解说明
@PostConstruct使用在方法上标注该方法是Bean的初始化方法
@PreDestroy使用在方法上标注该方法是Bean的销毁方法
//@Component
@Repository
public class UserDaoImpl implements UserDao {

    @PostConstruct
    public void init(){
        System.out.println("userDao被初始化了");
    }

    @Override
    public void show() {
        System.out.println("这是userDao的方法");
    }

    @PreDestroy
    public void destroy(){
        System.out.println("userDao被销毁了");
    }
}

七、作用范围注解

注解说明
@Scope标注Bean的作用范围,scope取值singleton prototype request session globalsession

总结(XML配置对比注解配置)

在这里插入图片描述


http://www.kler.cn/a/7895.html

相关文章:

  • 从H264视频中获取宽、高、帧率、比特率等属性信息
  • 创建型设计模式与面向接口编程
  • 基于微信小程序的公务员考试学习平台的设计与实现,LW+源码+讲解
  • SQL中的时间类型:深入解析与应用
  • 【JavaScript】为 setInterval()定义变量,存储ID
  • 网络基础Linux
  • vue2和vue3的区别
  • 深度学习语义分割篇——FCN原理详解篇
  • 手机怎么投屏到电脑?3个简单的方法教会你!
  • 一本通 3.4.2 图的最短路径
  • FL Studio21中文版本下载及语言切换调整
  • Spring循环依赖
  • LCP 44. 开幕式焰火
  • Chat-GLM 详细部署(GPU显存>=12GB)
  • PMP如何备考,才能一次通过呢?
  • Twitter-高性能hash_map
  • AM62X +FPGA+AD/DA 的TSN工业网关解决方案
  • vue实现轨迹回放(很详细)
  • 最近写的怎样审核不通过
  • Android如何做出带有复杂水印的图片
  • Web基础与HTTP协议
  • Maven项目中的依赖出现版本冲突,最终发现是对Dependency Scope理解有误
  • Win11的两个实用技巧系列之找不到wifi网络的解决方法、双系统开机选择系统方法
  • 数据库系统工程师——考试分析(2023备考)
  • 【虚幻引擎】UE4 动画蓝图,动画,状态机三者之间的联系
  • UTONMOS:2023年,亚洲或将实现区块链游戏复兴