前言
本文将讲解spring框架的基础内容
Spring
首先,我们需要了解,spring是什么?
spring是一个轻量级的IOC和AOP的一站式java开发框架
作用是简化企业级开发
轻量级:框架体积小(核心模块)
其中 IOC: Inversion of Control 控制反转
IOC的作用是可以把创建对象的控制权,反转给spring框架
控制反转 这是一种编程思想 把生成的对象的控制权,反转给spring框架,spring框架负责管理对象的整个生命周期过程
对外提供获取对象的方法,我们在程序中哪里需要使用,就在哪里获取即可
我们需要使用的对象都由ioc容器进行管理,不需要我们去手动通过new 的方式去创建对象,由ioc容器直接帮我们组装好,当我们需要使用的时候直 接从ioc容器中直接获取就可以了。
正控:若要使用某个对象,需要自己去负责对象的创建
反控:若要使用某个对象,只需要从 Spring 容器中获取需要使用的对象,
不关心对象的创建过程,也就是把创建对象的控制权反转给了Spring框架.
以前我们在程序中需要对象,都是自己new,例如 new Student对象.
AOP: Aspect Oriented Programming 面向切面编程
将程序中的一些公共的非业务的代码分离提前出来,然后在业务代码执行时,给他们横切进来
使用的动态代理的机制实现,在我们的业务代码,不显示的调用,但是执行业务代码,会通过代理对象,调用非业务代码
一站式:除了核心的IOC和AOP功能之外,还对数据访问层,web层都有封装,所以是一站式框架
Spring的搭建
Maven导入spring核心基础jar
在pom.xml文件中创建<dependencies></dependencies>标签,并添加下方代码
<!-- spring-context--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.2.2.RELEASE</version> </dependency>
添加好后入下图所示(我这是之前创建好的所以刚添加后会标红)
字体是红色点击右上角的图标安装并刷新.
在左边框中右键选中resources,选中new,选择File类,创建spring.xml文件
创建好的文件是一片空白
这时我们需要编写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 "> <bean> id = "user" class="com.ff.spring.model.User"></bean> </beans>
编写一个Admin实体类
以Admin实体类举例:
<bean id="admin" class="com.zhu.springpro.model.Admin" scope="prototype"></bean>
以上步骤都完成后,在java中创建一个Test文件,测试spring
输出结果(这里是地址是因为我们没有在具体实现类中实现ToString()方法)
代码实现
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
Admin admin = (Admin) applicationContext.getBean("admin");
Admin admin1 = applicationContext.getBean("admin",Admin.class);System.out.println(admin);
System.out.println(admin1);
对于新面孔ClassPathXmlApplicationContext
它是spring框架中的一个具体的实现类,负责生成,管理程序中的对象 可以看做一个容器,所以一般把spring框架也称为spring容器,或者叫做IOC容器
new ClassPathXmlApplicationContext("spring.xml"); getBeen("admin");
从spring框架(容器)中获取到需要的对象
Spring Bean 管理
从名字来看,似乎与我们上方的<bean>标签有关
其实没错,bean对象
由于把对象交给spring管理后,spring会对对象进行功能的增强,所以在spring框架中生成的对象,统一称为bean对象.
区分这个对象是我们自己new的还是spring框架生成的
spring中 bean管理有两种方式,所以我们将介绍两种方式(水字数)
1.基于xml配置方式
在上方可能会有不少小伙伴有疑问<bean></bean>标签是什么意思?
这里使用bean标签,是用来配置需要让spring管理的类
id=“对象名称,可以在getBean中获得spring生成的对象
class=”需要让spring管理的类的地址
scope=“配置bean的作用域”
scope=”singleton“ 单例的 在spring框架启动时就创建,而且始终只创建一个对象 scope="prototype" 原型的(多例的) 在每次或的对象时,创建一个新的对象
Xml配置方式依赖注入
指 Spring 创建对象的过程中,将对象依赖属性(简单值,集合,对象)通过配置设置给该对象。 实现IOC需要DI做支持
注入的方式:
通过属性注入,属性的set 方法注入
在之前创建好的spring.xml文件中添加下方代码
<bean id="admin" class="com.ffyc.springpro.model.Admin" scope="prototype"> <property name="account" value="admin"></property> <property name="password" value="111"></property> </bean>
test文件中的代码不改变,得出结果
构造方法注入
在java中分别创建AdminDao文件和AdminService文件,分别对应程序执行时的dao层和service层.
在AdminDao类中创建saveAdmin()方法
在AdminService类中创建saveAdmin()方法
在不改变test文件,结果输出为
2.基于注解方式
开启spring注解扫描功能 指定扫描的包
在resources文件中创建spring.xml文件
并编写spring配置文件
创建好的spring.xml文件如下图所示
将下面这行代码输入
<context:component-scan base-package="com.zhu.springpro"> </context:component-scan>
会出现下面这种情况,不要慌张这是因为没有在xmlns中引入context地址,将鼠标移至context上
会弹出提示,点击红色提示会自动置入xmlns (若没有提示,将以下代码代替<beans>标签即可)
<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 https://www.springframework.org/schema/context/spring-context.xsd">
这时,spring.xml文件就配置好了,我们可以得到下方画面(注意这里可以使用context是因为之前已经提前下载好了spring-context的jar包)
再打开之前创建好的Admin文件
在类声明上方加上注解
@Component(value = "admin") @Scope(value = "prototype")
这里的两行注释等同于xml中<bean id="admin" class="com.zhu.springpro.model.Admin" >
在AdminDao类声明上方加注解
@Repository(value = "adminDao")
并在saveAdmin()方法中加入下方代码
List<Admin> admins = jdbcTemplate.query("select * from admin", new RowMapper<Admin>() { public Admin mapRow(ResultSet resultSet, int i) throws SQLException { Admin admin = new Admin(); admin.setAccount(resultSet.getString("account")); admin.setPassword(resultSet.getString("password")); return admin; } }); System.out.println(admins);
注意:这里需要与数据库进行交互,所以需要在pom.xml文件中下载有关mysql的jar包
<!--mysql--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.16</version> </dependency>
相同的,在AdminService类声明上方加上注解
@Service(value = "adminService")
@Service作用与@Resource相同,只是为了后续扩展功能,在不同的层使用不同的注解标记
并在AdminService类中创建AdminDao对象,并创建set()和get()方法
这里@Autowired 是spring框架提供的注解
用于在属性和属性的set方法上,如果写在属性上,set方法都可以不需要
默认情况下,要注入的值是不能为空的 required = true 注入空会报错
自动注入有两种值的匹配方式
1.通过属性类型的查找
2.通过对象的名字查找
@Qualifier(value = "adminDao"),放在@Autowired下方,是@Autowired通过对象的名字查找时的格式,"adminDao"是对象的名字
这里的@Resource 是java语言中提供的语言注解标签 也是添加在属性上,不需要写set方法 注入的值也是不能为空的 也可以通过类型查找要注入的对象
@Resource 也可以通过对象名查找要注入的对象
@Resource与@Autowired的功能基本一致,区别在于其中@Autowired属性是value,
@Resource的属性是name
再创建一个test2文件,输入以下测试代码
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml"); AdminService adminService = applicationContext.getBean("adminService", AdminService.class); adminService.saveAdmin();
测试结果如下
这里最后的结果是我之前在数据库写好的数据
注解与 XML 的对比
经过这么多的内容了解,让我们来总结一些注解与xml之间的优缺点
注解优点: 方便,直观,高效(代码少,没有配置文件的书写那么复杂)。
注解缺点:以硬编码的方式写入到 Java 代码中,修改是需要重新编译代码的。
xml 优点是: 配置和代码是分离的,在 xml 中做修改,无需编译代码,只需重 启服务器即可将新的配置加载。
xml 的缺点是:编写麻烦,效率低,大型项目过于复杂。
注解标签的总结
@Component(value=“user”)等同于
@Repository 以上注解都可以实现创建对象功能,只是为了后续扩展功能,在不同的层使用不 同的注解标记
@Scope(value=“prototype”) 原型
@Scope(value=“ singleton ”) 单例
@Autowired 是spring框架提供的注解 用于在属性和属性的set方法上,如果写在属性上,set方法都可以不需要
默认情况下,要注入的值是不能为空的 required = true 注入空会报错
自动注入有两种值的匹配方式
1.通过属性类型的查找
2.通过对象的名字查找 @Qualifier(value = "adminDao")
@Resource 是java语言中提供的语言注解标签 也是添加在属性上,不需要写set方法
注入的值也是不能为空的 也可以通过类型查找要注入的对象
@Resource 也可以通过对象名查找要注入的对象 @Resource(name = "adminDao")
byType 自动注入 该注解默认使用按类型自动装配 Bean 的方式。
byName 自动注入 如果我们想使用按照名称(byName)来装配,可以结合@Qualifier注解一起 使用。 需要在引用属性上联合使用注解@Autowired 与@Qualifier。@Qualifier 的 value 属性用于指定要匹配的 Bean 的 id 值。
JDK 注解@Resource 自动注入 Spring 提供了对 jdk中@Resource注解的支持。@Resource 注解既可以按名 称匹配Bean,也可以按类型匹配 Bean。默认按照ByName自动注入
byName 注入引用类型属性 @Resource 注解指定其 name 属性,则 name 的值即为按照名称进行匹配 的 Bean 的 id。
今天的spring总结先告一段落,如果感觉不错,可以点个关注和赞,稍后还会继续进行补充