【JavaEE---复习】一、.Spring的Ioc和DI

1.Spring的Ioc和DI

1.1 Spring简介

​ Spring是分层的JavaSE/EE应用full-stack轻量级开源框架,以IOC和AOP为内核。

IOC: 反转控制 AOP:面向切面编程

​ IOC Inversion of control(控制反转) :将对象的创建权反转给Spring

​ IOC的方法就是工厂+反射+配置文件

​ 如果想调用其他类,只需要修改配置文件就可以了

//配置文件

<bean id="xxxx" class="xx.xx.xxx.xxx"/>

//工厂

public class BeanFactory {

public static Object getBean(String id) {

// 解析配置文件

ApplicationContext ac = new ClassPathXmlApplicationContext("xxx.xml");

// 反射

Class<?> forName = UserDao.class.forName(id);

return forName.newInstance();

}

DI:依赖注入

​ 前提必须有IOC的环境,Spring管理这个类的时候将类的依赖的属性注入(设置)进来

​ 一站式框架就是有javaEE每一层解决方案的框架。

​ **WEB层:**SpringMVC

Service层:Spring层的Bean管理,Spring的声明式事务

DAO层: Spring的jdbc模板,Spring的ORM模块(用于和ORM框架整合,如mybatis)

​ 优势:1)方便解耦,简化开发

​ 2)AOP编程的支持

​ 3)声明式事务的支持

​ 4)方便程序的测试

​ 5)方便集成各种优秀框架

​ 6)降低JavaEE API的使用难度

​ 7)Java源码时经典学习范例

1.2 Spring开发步骤

​ 1)在pom.xml 导入Spring开发的基本包坐标

​ spring-context

​ 2)编写Dao接口和实现类

​ 3)创建Springle核心配置文件applicationContext.xml

​ 4)在SPringle配置文件中配置UserDaoImpl

​ 5)使用Spring的API获得Bean实例

ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");

UserDao userDao = (UserDao) applicationContext.getBean("userDao");

userDao.save();

1.3 Spring配置文件

1.3.1 Bean标签基本配置

​ 用于配置对象交由Spring来创建。

​ 默认情况下它调用的是类中的无参构造函数,如果没有无参构造函数则不能创建成功。

​ 基本属性:

​ 1.id Bean实例在Spring容器中的唯一标识

​ 2.class Bean的全限定名称

​ 3.scope 指对象的作用范围,取值如下

取值范围说明
singleton默认值,单例的
prototype多例的
requestWEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 request 域中
sessionWEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 session 域中
global sessionWEB 项目中,应用在 Portlet 环境,如果没有 Portlet 环境那么globalSession 相当 于 session

1.3.2 Bean标签范围配置

1)当scope的取值为singleton时

Bean的实例化个数:1个

Bean的实例化时机:当Spring核心文件被加载时,实例化配置的Bean实例

Bean的生命周期:

对象创建:当应用加载,创建容器时,对象就被创建了

对象运行:只要容器在,对象一直活着

对象销毁:当应用卸载,销毁容器时,对象就被销毁了

2)当scope的取值为prototype时

Bean的实例化个数:多个

Bean的实例化时机:当调用getBean()方法时实例化Bean

Bean的生命周期:

对象创建:当使用对象时,创建新的对象实例

对象运行:只要对象在使用中,就一直活着

对象销毁:当对象长时间不用时,被 Java 的垃圾回收器回收了

1.3.3 Bean生命周期配置

​ init-method 指定类中初始化方法名称

​ destory-method 指定类中销毁方法名称

1.3.4 Bean实例化三种方式

无参构造方法实例化

会根据默认无参构造方法来创建类对象,如果bean中没有默认无参构造函数,将会创建失败

<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"/>

工厂静态方法实例化

public class StaticFactoryBean {

public static UserDao createUserDao(){

return new UserDaoImpl();

}

}

<bean id="userDao" class="com.itheima.factory.StaticFactoryBean" factory-method="createUserDao" />

工厂实例方法实例化

public class DynamicFactoryBean { public UserDao createUserDao(){ return new UserDaoImpl(); } }

<bean id="factoryBean" class="com.itheima.factory.DynamicFactoryBean"/> <bean id="userDao" factory-bean="factoryBean" factory-method="createUserDao"/>

1.3.5 Spring的属性注入

1)构造方法的注入

<bean id="user" class="xxx.User">

<constructor-arg name="name" value="老周"/>

<constructor-arg name="age" value="25"/>

</bean>

2) set方法的方式的属性注入

<bean id="user" class="xxx.User">

<property name="name" value="老周"/>

<property name="age" value="25"/>

</bean>

3)SpEL的属性注入

// SpEL:Spring Expression Language,Spring的表达式语言。

<bean id="user" class="xxx.User">

<property name="name" value="#{user.name}"/>

<property name="age" value="#{user.age}"/>

</bean>

4)集合类型的属性注入
①注入数组类型

<bean id="collectionBean" class="com.itheima.spring.demo5.CollectionBean">

<!-- 数组类型 -->

<property name="arrs">

<list>

<value>王东</value>

<value>赵洪</value>

<value>李冠希</value>

</list>

</property>

②注入list集合

<!-- 注入list集合 -->

<property name="list">

<list>

<value>李兵</value>

<value>赵如何</value>

<value>邓凤</value>

</list>

</property>

③注入set集合

<property name="set">

<set>

<value>aaa</value>

<value>bbb</value>

<value>ccc</value>

</set>

</property>

④注入Map集合

<property name="map">

<map>

<entry key="aaa" value="111"/>

<entry key="bbb" value="222"/>

<entry key="ccc" value="333"/>

</map>

</property>

</bean>

Spring的重点配置

标签

**id属性:**在容器中Bean实例的唯一标识,不允许重复

class属性:要实例化的Bean的全限定名

scope属性:Bean的作用范围,常用是Singleton(默认)prototype

**标签:**属性注入

name属性:属性名称

**value属性:**注入的普通属性值

**ref属性:**注入的对象引用值

标签

map标签

标签

标签

标签:导入其他的Spring的分文件

1.4 Spring相关API

1.4.1 ApplicationContext 的继承体系

applicationContext:

接口类型,代表应用上下文,可以通过其实例获得 Spring 容器中的 Bean 对象。

1.4.2 ApplicationContext的实现类

1)ClassPathXmlApplicationContext

它是从类的根路径下加载配置文件 推荐使用这种

2)FileSystemXmlApplicationContext

它是从磁盘路径上加载配置文件,配置文件可以在磁盘的任意位置。

3)AnnotationConfigApplicationContext

当使用注解配置容器对象时,需要使用此类来创建 spring 容器。它用来读取注解。

1.4.3 Spring的重点API

ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");

UserService userService1 = (UserService) applicationContext.getBean("userService");

UserService userService2 = applicationContext.getBean(UserService.class);

1.5 Spring的注解开发

​ Spring是轻代码而重配置的框架,配置比较繁重,影响开发效率,多以注解开发时一种趋势,注解代替xml配置文件可以简化配置,提高开发效率。

1.5.1 Spring原始注解

​ 主要是代替的配置

​ 注解开发时,需要在appilcationContext.xml中配置组件扫描,作用是指定哪个包及其子包下的Bean需要进行扫描以便识别使用注解配置的类、字段和方法。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4AnYAPmh-1667198865739)(C:\Users\黄蕴妍\AppData\Roaming\Typora\typora-user-images\image-20220524100106033.png)]

注解说明
@Component使用在类上用于实例化Bean
@Controller使用在web层类上用于实例化Bean
@Service使用在service层类上用于实例化Bean
@Repository使用在dao层类上用于实例化Bean
@Autowired使用在字段上用于根据类型依赖注入
@Qualifier结合@Autowired一起使用用于根据名称进行依赖注入
@Resource相当于@Autowired+@Qualifier,按照名称进行注入
@Value注入普通属性
@Scope标注Bean的作用范围
@PostConstruct使用在方法上标注该方法是Bean的初始化方法
@PreDestroy使用在方法上标注该方法是Bean的销毁方法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U7PfDcew-1667198865740)(C:\Users\黄蕴妍\AppData\Roaming\Typora\typora-user-images\image-20220524100145693.png)]

使用@Compont或@Service标识UserServiceImpl需要Spring进行实例化

使用@Autowired或者@Autowired+@Qulifier或者@Resource进行userDao的注入

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1zhgXnNv-1667198865741)(C:\Users\黄蕴妍\AppData\Roaming\Typora\typora-user-images\image-20220524100233495.png)]

使用@Value进行字符串的注入

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WK193xHY-1667198865741)(C:\Users\黄蕴妍\AppData\Roaming\Typora\typora-user-images\image-20220524100343429.png)]

使用@Scope标注Bean的范围

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gUW7G52O-1667198865742)(C:\Users\黄蕴妍\AppData\Roaming\Typora\typora-user-images\image-20220524100412734.png)]

使用@PostConstruct标注初始化方法,使用@PreDestroy标注销毁方法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JsAYsEdy-1667198865743)(C:\Users\黄蕴妍\AppData\Roaming\Typora\typora-user-images\image-20220524100436639.png)]

1.5.2 Spring新注解

注解说明
@Configuration用于指定当前类是一个 Spring 配置类,当创建容器时会从该类上加载注解
@ComponentScan用于指定 Spring 在初始化容器时要扫描的包。 作用和在 Spring 的 xml 配置文件中的 一样
@Bean使用在方法上,标注将该方法的返回值存储到 Spring 容器中
@PropertySource用于加载.properties 文件中的配置
@Import用于导入其他配置类

在这里插入图片描述

1.6 Spring集成Junit

1.6.1 Spring集成Junit步骤

① 导入spring集成Junit的坐标

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sOJ7nC3C-1667198865745)(C:\Users\黄蕴妍\AppData\Roaming\Typora\typora-user-images\image-20220524101547764.png)]

② 使用@Runwith注解替换原来的运行期

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CpKy3n9P-1667198865746)(C:\Users\黄蕴妍\AppData\Roaming\Typora\typora-user-images\image-20220524101558296.png)]

③ 使用@ContextConfiguration指定配置文件或配置类

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U9uHZyrQ-1667198865747)(C:\Users\黄蕴妍\AppData\Roaming\Typora\typora-user-images\image-20220524101609186.png)]

④ 使用@Autowired注入需要测试的对象

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5j4w8HEO-1667198865747)(C:\Users\黄蕴妍\AppData\Roaming\Typora\typora-user-images\image-20220524101629126.png)]

⑤ 创建测试方法进行测试

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g6YHh80a-1667198865747)(C:\Users\黄蕴妍\AppData\Roaming\Typora\typora-user-images\image-20220524101637726.png)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值