目录
前言
本篇是本人初学Spring时做的一些关于IOC方面的总结,有缺漏和错误之处还请指出
一、Spring是什么?
Spring 是个java企业级应用的开源开发框架。Spring主要用来开发Java应用,但是有些扩展是针对构建J2EE平台的web应用。Spring 框架目标是简化Java企业级应用开发,并通过POJO(普通Java对象即"Plain Old Java Object")为基础的编程模型促进良好的编程习惯
二、IOC是什么?
IOC即 Invision Of Control (控制反转)在Spring中我们将设计好的对象交给IOC容器管理,而不是传统的在对象内部直接控制。这样对象的控制权就反转了,程序员无需关心对象的各种创建。只需关注业务的本身,大大降低了程序的耦合性。
P.s. 藕合就是程序间的依赖关系。我们在开发过程中应该做到降低程序间的这种依赖关系也就是解耦,通俗的说就是在程序开发时做到编译不依赖,运行时依赖。
三、如何创建一个Spring项目
步骤一:创建一个空的Maven项目
我用的是IDEA2022,在项目创建上可能与2021前的版本界面不一样
步骤二:添加Spring的依赖
在pom.xml中添加依赖
<!--spring的依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
P.s. 记得刷新Maven库,可以点击idea的出的刷新图标也可以执行下图步骤
步骤三:使用IOC
方式1:通过xml使用IOC
我们先看一下IDEA给我们创建出来的项目结构
编写的xml文件全部存放于resources文件夹内
步骤1:创建beans.xml文件(叫啥都行)
创建文件的方式
P.s. 如果没有进行步骤二将无法显示“Spring Config”选项
beans.xml配置文件
至此我们beans.xml文件就创建成功了,下面就是如何注入对象的信息
步骤2:注入对象信息
创建一个User对象
步骤3:在beans.xml中配置User的信息,设定User的相关属性
<?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="user" class="demo.User">
<property name="username" value="张三"></property>
<property name="age" value="18"></property>
<!-- 引用日期对象 -->
<property name="birthDate" ref="date_ref"></property>
</bean>
<!-- 实例化日期对象 -->
<bean id="date_ref" class="java.util.Date"></bean>
</beans>
步骤4:创建一个测试类进行测试
package demo;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class test {
public static void main(String[] args) {
//读取Spring的核心配置文件
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
//从ioc容器中获取User对象,并注入到myUser中
User myUser = (User) context.getBean("user");
System.out.println(myUser.toString());
}
}
方式2:通过注解使用IOC
注解配置和xml配置实现的功能都是一样的,基本上现在开发都是使用注解
1、@Component
用于创建对象的注解
相当于
<bean id="" class="">
作用: 把资源让 spring 来管理。相当于在 xml 中配置一个 bean。
属性: value:指定 bean 的 id。如果不指定 value 属性,默认 bean 的 id 是当前类的类名。首字母小写。
例子:
还是之前那个User类
用注解实现则只需要通过@Component将该类的对象注入进IOC容器中
然后我们需要在beans.xml文件中进行配置来扫描所有使用注解的类
关键词:component-scan
下为beans.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">
<!-- 扫描注解类 -->
<context:component-scan base-package="practice"/>
</beans>
如此便可以实现扫描所有使用注解的类
2、@Component衍生的注解
除了上面使用到的Component注解外还有几个常用的注解: @Component: 用于任意类的注入 @Repository: 用于标识在dao类上 @Service: 用于标识在Service类上 @Controller: 用于标识在控制器类上
P.s. 使用方式和@Component一样
3、用于注入数据的注解——@Autowired
@Autowired是按照Bean的类型,从IOC容器中获取对象进行装配P.s. @Autowired功能和另一个注解@Resource 相似,他们之间的不同点根据我的理解在于
@Autowired是根据类名进行扫描查询,如果是同类则根据名称查询
@Resource 则是单纯根据名称进行扫描和查询
他们主要多用于业务层内不同业务方法的注入
就像上面两张图的例子,通过使用@Autowired我就不用在UserService中直接创建UserInfo对象而不是传统的new方法创建
4、@ Scope
用于指定bean的作用范围,属性value:指定范围的取值。 常用取值:singleton(单例)、 prototype(多例)和生命周期相关,他们的作用就和在bean标签中使用init-method和destroy-methode的作用是一样的
5、Spring5的新增注解 @Configuration 和 @ComponentScan
5.1、@Configuration
用于指定当前类是一个 spring 配置类,当创建容器时会从该类上加载注解。获取容器时需要使用AnnotationApplicationContext(有@Configuration 注解的类.class)。
5.2、@ComponentScan
用于指定 spring 在初始化容器时要扫描的包。作用和在 spring 的 xml 配置文件中的:
<context:component-scan base-package="com "/>是一样的
属性: basePackages:用于指定要扫描的包。和该注解中的 value 属性作用一样
语法:
@ComponentScan(basePackages = {"要扫描的包名1","要扫描的包名2",...})
上面两个注解可以实现零配置文件实现IOC,具体案例可以参考下面大神的优快云博客的对应内容,本篇的大部分内容也是我看了他的博客练习总结的