【Spring教程九】Spring框架实战:全面深入详解IOC/DI注解开发

这篇具有很好参考价值的文章主要介绍了【Spring教程九】Spring框架实战:全面深入详解IOC/DI注解开发。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


欢迎大家回到《 Java教程之Spring30天快速入门》,本教程所有示例均基于Maven实现,如果您对Maven还很陌生,请移步本人的博文《 如何在windows11下安装Maven并配置以及 IDEA配置Maven环境》,本文的上一篇为《 IOC/DI配置管理第三方bean && 加载properties文件》。

【Spring教程九】Spring框架实战:全面深入详解IOC/DI注解开发,# SSM与SpringBoot教程,Java教程,spring,java,后端
Spring的IOC/DI对应的配置开发就已经讲解完成,但是使用起来相对来说还是比较复杂的,复杂的地方在配置文件。
前面咱们聊Spring的时候说过,Spring可以简化代码的开发,到现在并没有体会到。
所以Spring到底是如何简化代码开发的呢?
要想真正简化开发,就需要用到Spring的注解开发,Spring对注解支持的版本历程:

  • 2.0版开始支持注解
  • 2.5版注解功能趋于完善
  • 3.0版支持纯注解开发

关于注解开发,我们会讲解两块内容注解开发定义bean和纯注解开发。
注解开发定义bean用的是2.5版提供的注解,纯注解开发用的是3.0版提供的注解。

1 环境准备

在学习注解开发之前,先来准备下案例环境:

  • 创建一个Maven项目
  • pom.xml添加Spring的依赖
<dependencies>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-context</artifactId>
		<version>5.2.10.RELEASE</version>
	</dependency>
</dependencies>
  • resources下添加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"
		xsi:schemaLocation="
			http://www.springframework.org/schema/beans
			http://www.springframework.org/schema/beans/spring-beans.xsd">
	<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>
</beans>
  • 添加BookDao、BookDaoImpl、BookService、BookServiceImpl类
public interface BookDao {
	public void save();
}
public class BookDaoImpl implements BookDao {
	public void save() {
	System.out.println("book dao save ..." );
}
}
public interface BookService {
	public void save();
}
public class BookServiceImpl implements BookService {
	public void save() {
		System.out.println("book service save ...");
	}
}
  • 创建运行类App
public class App {
	public static void main(String[] args) {
	ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
		BookDao bookDao = (BookDao) ctx.getBean("bookDao");
		bookDao.save();
	}
}

最终创建好的项目结构如下:
【Spring教程九】Spring框架实战:全面深入详解IOC/DI注解开发,# SSM与SpringBoot教程,Java教程,spring,java,后端

2 注解开发定义bean

在上述环境的基础上,我们来学一学Spring是如何通过注解实现bean的定义开发?
步骤1:删除原XML配置
将配置文件中的标签删除掉

<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>

步骤2:Dao上添加注解
在BookDaoImpl类上添加@Component注解

@Component("bookDao")
public class BookDaoImpl implements BookDao {
	public void save() {
		System.out.println("book dao save ..." );
	}
}

注意:@Component注解不可以添加在接口上,因为接口是无法创建对象的
XML与注解配置的对应关系:
【Spring教程九】Spring框架实战:全面深入详解IOC/DI注解开发,# SSM与SpringBoot教程,Java教程,spring,java,后端
步骤3:配置Spring的注解包扫描
为了让Spring框架能够扫描到写在类上的注解,需要在配置文件上进行包扫描

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="
		http://www.springframework.org/schema/beans
		http://www.springframework.org/schema/beans/spring-beans.xsd">
	<context:component-scan base-package="com.itheima"/>
</beans>

说明:
component-scan

  • component:组件,Spring将管理的bean视作自己的一个组件
  • scan:扫描

base-package指定Spring框架扫描的包路径,它会扫描指定包及其子包中的所有类上的注解。

  • 包路径越多[如:com.itheima.dao.impl],扫描的范围越小速度越快
  • 包路径越少[如:com.itheima],扫描的范围越大速度越慢
  • 一般扫描到项目的组织名称即Maven的groupId下[如:com.itheima]即可。

步骤4:运行程序
运行App类查看打印结果
【Spring教程九】Spring框架实战:全面深入详解IOC/DI注解开发,# SSM与SpringBoot教程,Java教程,spring,java,后端
步骤5:Service上添加注解
在BookServiceImpl类上也添加@Component交给Spring框架管理

@Component
public class BookServiceImpl implements BookService {
	private BookDao bookDao;
	public void setBookDao(BookDao bookDao) {
		this.bookDao = bookDao;
	}
	public void save() {
		System.out.println("book service save ...");
		bookDao.save();
	}
}

步骤6:运行程序
在App类中,从IOC容器中获取BookServiceImpl对应的bean对象,打印

public class App {
	public static void main(String[] args) {
		ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
		BookDao bookDao = (BookDao) ctx.getBean("bookDao");
		System.out.println(bookDao);
		//按类型获取bean
		BookService bookService = ctx.getBean(BookService.class);
		System.out.println(bookService);
	}
}

打印观察结果,两个bean对象都已经打印到控制台
【Spring教程九】Spring框架实战:全面深入详解IOC/DI注解开发,# SSM与SpringBoot教程,Java教程,spring,java,后端
说明:

  • BookServiceImpl类没有起名称,所以在App中是按照类型来获取bean对象
  • @Component注解如果不起名称,会有一个默认值就是当前类名首字母小写,所以也可以按照名称获取,如:
BookService bookService = (BookService)ctx.getBean("bookServiceImpl");
System.out.println(bookService);

对于@Component注解,还衍生出了其他三个注解@Controller、@Service、@Repository
通过查看源码会发现:
【Spring教程九】Spring框架实战:全面深入详解IOC/DI注解开发,# SSM与SpringBoot教程,Java教程,spring,java,后端
这三个注解和@Component注解的作用是一样的,为什么要衍生出这三个呢?
方便我们后期在编写类的时候能很好的区分出这个类是属于表现层、业务层还是数据层的类。
知识点1:@Component等
【Spring教程九】Spring框架实战:全面深入详解IOC/DI注解开发,# SSM与SpringBoot教程,Java教程,spring,java,后端

3 纯注解开发模式

上面已经可以使用注解来配置bean,但是依然有用到配置文件,在配置文件中对包进行了扫描,Spring在3.0版已经支持纯注解开发

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

具体如何实现?

3.1 思路分析

实现思路为:

  • 将配置文件applicationContext.xml删除掉,使用类来替换。

3.2 实现步骤

步骤1:创建配置类
创建一个配置类SpringConfig

public class SpringConfig {
}

步骤2:标识该类为配置类
在配置类上添加@Configuration注解,将其标识为一个配置类,替换applicationContext.xml

@Configuration
public class SpringConfig {
}

步骤3:用注解替换包扫描配置
在配置类上添加包扫描注解@ComponentScan替换<context:component-scan base-package=“”/>

@Configuration
@ComponentScan("com.itheima")
public class SpringConfig {
}

步骤4:创建运行类并执行
创建一个新的运行类AppForAnnotation

public class AppForAnnotation {
	public static void main(String[] args) {
		ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
		BookDao bookDao = (BookDao) ctx.getBean("bookDao");
		System.out.println(bookDao);
		BookService bookService = ctx.getBean(BookService.class);
		System.out.println(bookService);
	}
}

运行AppForAnnotation,可以看到两个对象依然被获取成功
【Spring教程九】Spring框架实战:全面深入详解IOC/DI注解开发,# SSM与SpringBoot教程,Java教程,spring,java,后端
至此,纯注解开发的方式就已经完成了,主要内容包括:

  • Java类替换Spring核心配置文件

【Spring教程九】Spring框架实战:全面深入详解IOC/DI注解开发,# SSM与SpringBoot教程,Java教程,spring,java,后端

  • @Configuration注解用于设定当前类为配置类
  • @ComponentScan注解用于设定扫描路径,此注解只能添加一次,多个数据请用数组格式
@ComponentScan({com.itheima.service","com.itheima.dao"})
  • 读取Spring核心配置文件初始化容器对象切换为读取Java配置类初始化容器对象
//加载配置文件初始化容器
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
//加载配置类初始化容器
ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);

知识点1:@Configuration
【Spring教程九】Spring框架实战:全面深入详解IOC/DI注解开发,# SSM与SpringBoot教程,Java教程,spring,java,后端
知识点2:@ComponentScan
【Spring教程九】Spring框架实战:全面深入详解IOC/DI注解开发,# SSM与SpringBoot教程,Java教程,spring,java,后端
小结:
这一节重点掌握的是使用注解完成Spring的bean管理,需要掌握的内容为:

  • 记住@Component、@Controller、@Service、@Repository这四个注解
  • applicationContext.xml中context:component-san/的作用是指定扫描包路径,注解为@ComponentScan
  • @Configuration标识该类为配置类,使用类替换applicationContext.xml文件
  • ClassPathXmlApplicationContext是加载XML配置文件
  • AnnotationConfigApplicationContext是加载配置类

3.3 注解开发bean作用范围与生命周期管理

使用注解已经完成了bean的管理,接下来按照前面所学习的内容,将通过配置实现的内容都换成对应的注解实现,包含两部分内容: bean作用范围和bean生命周期。

3.3.1 环境准备

老规矩,学习之前先来准备环境:

  • 创建一个Maven项目
  • pom.xml添加Spring的依赖
<dependencies>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-context</artifactId>
		<version>5.2.10.RELEASE</version>
	</dependency>
</dependencies>
  • 添加一个配置类SpringConfig
@Configuration
@ComponentScan("com.itheima")
public class SpringConfig {
}
  • 添加BookDao、BookDaoImpl类
public interface BookDao {
	public void save();
}
@Repository
public class BookDaoImpl implements BookDao {
	public void save() {
		System.out.println("book dao save ..." );
	}
}
  • 创建运行类App
public class App {
	public static void main(String[] args) {
		AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
		BookDao bookDao1 = ctx.getBean(BookDao.class);
		BookDao bookDao2 = ctx.getBean(BookDao.class);
		System.out.println(bookDao1);
		System.out.println(bookDao2);
	}
}

最终创建好的项目结构如下:
【Spring教程九】Spring框架实战:全面深入详解IOC/DI注解开发,# SSM与SpringBoot教程,Java教程,spring,java,后端

3.3.2 Bean的作用范围

(1)先运行App类,在控制台打印两个一摸一样的地址,说明默认情况下bean是单例
【Spring教程九】Spring框架实战:全面深入详解IOC/DI注解开发,# SSM与SpringBoot教程,Java教程,spring,java,后端
(2)要想将BookDaoImpl变成非单例,只需要在其类上添加@scope注解

@Repository
//@Scope设置bean的作用范围
@Scope("prototype")
public class BookDaoImpl implements BookDao {
	public void save() {
		System.out.println("book dao save ...");
	}
}

再次执行App类,打印结果:
【Spring教程九】Spring框架实战:全面深入详解IOC/DI注解开发,# SSM与SpringBoot教程,Java教程,spring,java,后端
知识点1:@Scope
【Spring教程九】Spring框架实战:全面深入详解IOC/DI注解开发,# SSM与SpringBoot教程,Java教程,spring,java,后端

3.3.3 Bean的生命周期

(1)在BookDaoImpl中添加两个方法,init和destroy ,方法名可以任意

@Repository
public class BookDaoImpl implements BookDao {
	public void save() {
		System.out.println("book dao save ...");
	}
	 public void init() {
		System.out.println("init ...");
	}
	public void destroy() {
		System.out.println("destroy ...");
	}
}

(2)如何对方法进行标识,哪个是初始化方法,哪个是销毁方法?
只需要在对应的方法上添加@PostConstruct和@PreDestroy注解即可。

@Repository
public class BookDaoImpl implements BookDao {
	public void save() {
		System.out.println("book dao save ...");
	}
	@PostConstruct //在构造方法之后执行,替换 init-method
	public void init() {
		System.out.println("init ...");
	}
	@PreDestroy //在销毁方法之前执行,替换 destroy-method
	public void destroy() {
		System.out.println("destroy ...");
	}
}

(3)要想看到两个方法执行,需要注意的是destroy只有在容器关闭的时候,才会执行,所以需要修
改App的类

public class App {
	public static void main(String[] args) {
		AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
		BookDao bookDao1 = ctx.getBean(BookDao.class);
		BookDao bookDao2 = ctx.getBean(BookDao.class);
		System.out.println(bookDao1);
		System.out.println(bookDao2);
		ctx.close(); //关闭容器
	}
}

(4)运行App,类查看打印结果,证明init和destroy方法都被执行了。

【Spring教程九】Spring框架实战:全面深入详解IOC/DI注解开发,# SSM与SpringBoot教程,Java教程,spring,java,后端
注意:@PostConstruct和@PreDestroy注解如果找不到,需要导入下面的jar包

<dependency>
	<groupId>javax.annotation</groupId>
	<artifactId>javax.annotation-api</artifactId>
	<version>1.3.2</version>
</dependency>

找不到的原因是,从JDK9以后jdk中的javax.annotation包被移除了,这两个注解刚好就在这个包中。
知识点1:@PostConstruct
【Spring教程九】Spring框架实战:全面深入详解IOC/DI注解开发,# SSM与SpringBoot教程,Java教程,spring,java,后端
知识点2:@PreDestroy
【Spring教程九】Spring框架实战:全面深入详解IOC/DI注解开发,# SSM与SpringBoot教程,Java教程,spring,java,后端
小结
【Spring教程九】Spring框架实战:全面深入详解IOC/DI注解开发,# SSM与SpringBoot教程,Java教程,spring,java,后端
PS:由于篇幅的原因。纯注解开发模式下的依赖注入,我们在下一节再讲文章来源地址https://www.toymoban.com/news/detail-768514.html

到了这里,关于【Spring教程九】Spring框架实战:全面深入详解IOC/DI注解开发的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring框架中IOC和DI详解

    来源黑马Spring课程,觉得挺好的 1、为什么要学习spring? 如果让本人用一句话去回答这个问题,那么我只能说:在J2EE的学习之路上,spring给我带来了开发的春天,让我们从JSP、sevlet的高耦合的开发中彻底的解救出来。 spring是目前最主流的框架 spring是学习后面课程(比如:

    2023年04月15日
    浏览(43)
  • 【Spring篇】IOC/DI注解开发

    🍓系列专栏:Spring系列专栏 🍉个人主页:个人主页 目录 一、IOC/DI注解开发 1.注解开发定义bean  2.纯注解开发模式 1.思路分析 2.实现步骤 3.注解开发bean作用范围与生命周期管理 1.环境准备 2.Bean的作用范围 3.Bean的生命周期 4.注解开发依赖注入 1.环境准备 2.注解实现按照类型注入

    2024年02月03日
    浏览(62)
  • 浅谈 Spring IOC 和 DI 以及 Spring 整合 Mybatis 的十四 个注解

    控制 : 指对对象的创建权 反转: 对象的创建由程序员在类中主动创建变为由Spring自动创建 Spring方式:所有的对象都是由Spring框架提前创建出来,存储到一个容器中,servlet需要Service了,就向Spring要一个 技术的作用 : 通过底层反射原理来 解开对象之间的耦合 注解 @Compone

    2024年02月16日
    浏览(28)
  • 【Spring教程21】Spring框架实战:Spring事务简介、AOP事务管理、代码示例全面详解

    欢迎大家回到《Java教程之Spring30天快速入门》,本教程所有示例均基于Maven实现,如果您对Maven还很陌生,请移步本人的博文《如何在windows11下安装Maven并配置以及 IDEA配置Maven环境》,本文的上一篇为《AOP(面对切面编程)知识总结》 事务作用:在数据层保障一系列的数据库

    2024年02月04日
    浏览(36)
  • 【Spring教程29】Spring框架实战:从零开始学习SpringMVC 之 服务器响应知识全面详解

    欢迎大家回到《Java教程之Spring30天快速入门》,本教程所有示例均基于Maven实现,如果您对Maven还很陌生,请移步本人的博文《如何在windows11下安装Maven并配置以及 IDEA配置Maven环境》,本文的上一篇为《SpringMVC 之 请求与请求参数详解》 上一节我们说了SpringMvc请求知识,这一节

    2024年02月03日
    浏览(50)
  • Spring框架IOC容器和DI依赖注入

    IOC(Invertion Of Control):控制反转,使用对象时,由使用new创建对象转变为由外部提供对象,此过程中对象的创建控制权由程序转移到外部的思想称之为控制反转. DI(Dependency Injection):依赖注入,在容器中建立bean与bean之间的关系的过程,称之为依赖注入 pom.xml依赖引入 BookDao BookDaoImpl Book

    2023年04月09日
    浏览(73)
  • 【Spring框架三】——Spirng IOC和DI的实现

    【Spring框架一】——Spring框架简介 本篇博客主要总结的是以Spring 5为例,通过XML方式和注解的方式分别实现IOC和DI。并使用Spring5 进行基础运用。 创建Maven项目:使用IDE创建一个maven项目 添加Spring依赖:在Maven配置文件pom.xml中添加Spring框架的依赖项 这样Spring的基础环境已经搭

    2024年02月05日
    浏览(38)
  • 深入理解 Spring IoC 和 DI:掌握控制反转和依赖注入的精髓

    在本文中,我们将介绍 IoC (控制反转)和 DI (依赖注入)的概念,以及如何在 Spring 框架中实现它们。 控制反转是软件工程中的一个原则,它将对象或程序的某些部分的控制权转移给容器或框架。我们最常在面向对象编程的上下文中使用它。 与传统编程相比,传统编程中我

    2024年02月04日
    浏览(44)
  • 理解SpringIOC和DI第一课(Spring的特点),IOC对应五大注解,ApplicationContext vs BeanFactory

    对象这个词在Spring范围内,称为bean Spring两大核心思想 1.IOC     (IOC是控制反转,意思是 控制权反转-控制权(正常是谁用这个对象,谁去创建,)-控制对象的控制权,反转的意思是创建对象的控制权,交给了Spring) 优点:解耦合 高内聚:一个模块内部的关系 低耦合:各个模

    2024年02月04日
    浏览(33)
  • 【Spring进阶系列丨第三篇】Spring核心技术之 IoC 与 DI 实战案例

    在上一篇文章中,我们学习了IoC与DI的相关概念与原理,现在让我们 以HelloWorld为例,编写一个程序,让创建对象的工作由Spring帮助我们创建。 一同感受一下Spring框架带给我们开发的便捷性。 这种做法是以前最常用的做法,HelloWorld这个类的对象是我们程序员自己去创建并为属

    2024年02月05日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包