Spring概念
1、非持久层框架
持久层:Mybatis|Hibernate
可以用于集成持久层框架
2、非视图层框架
视图层:SpringMvc(主流)|Steuts|Struts1(弃用)
可以用于集成视图层框架
3、基本概念
分层框架一站式:基本可以满足web项目开发需要 轻量级(配置简单-零配置开发(注解))
两大核心:
IOC(控制反转与依赖转入)、AOP(面向切面编程)-OOP(面向对象)
解耦:高内聚 低耦合 Bean实例化 注入(依赖)
Spring相关服务(功能):邮件服务(邮件发送)、事务控制(AOP)、定时任务执行(Quartz)、JMS
Spring框架模块划分
- Spring-IOC:Beans Core Context SpEL 控制反转与依赖注入
- Spring-AOP:Aop Aspects 面向切面
- Spring-jdbc:持久层操作
- Spring-Mvc:Web Servlet
- Spring-Test:单元测试
Spring框架环境搭建
最终目标:使用Spring框架实现对象的实例化 借助控制台实现对象方法调用
1、创建Spring普通工程
使用Idea创建Mavan普通工程 quickstart
2、添加坐标
<!--
Spring 核心坐标
-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.9.RELEASE</version>
</dependency>
3、添加Bean对象代码
package com.shsxt.service;
public class UserService {
//private IXxService xxService = new XxService1();
//private XxDao xxDao=new MYsqlXxDao();
public void test(){
System.out.println("hello Spring");
}
}
4、配置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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<!---
配置需要交给spring 框架实例化的对象
id:Bean对象唯一标识
class:Bean 对象全路径
-->
<bean id="userService" class="com.shsxt.service.UserService"></bean>
</beans>
5、执行测试
package com.shsxt;
import com.shsxt.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Starter {
public static void main(String[] args) {
/* UserService userService=new UserService();
userService.test();*/
ApplicationContext ac =new ClassPathXmlApplicationContext("beans.xml");
UserService userService= (UserService) ac.getBean("userService");
userService.test();
UserService userService1= (UserService) ac.getBean("userService");// 单例对象
System.out.println(userService+","+userService1);
}
}
Spring IOC 容器实现思路分析
ApplicationContext ac =new ClassPathXmlApplicationContext("beans.xml");
UserService userService= (UserService) ac.getBean("userService");
怎么实现?
思路分析
技术点:
工厂设计模式
xml解析-dom4j
反射
单例
实现方案
1、定义工厂类-接口-SxtBeanFactory
Object getBean(String beanName);
2、定义实现类 实现SxtBeanFactory
思路:
1、文件加载
将xml文件加载到内存
2、xml解析
dom4j
读取bean标签 获取id class
内容如何存取-集合List<Map|JavaBean> Map<id,class>
3、对象的实例化
遍历集合 List|Map
id-class :反射实例化对象 -->Map<id,class>
4、返回对象
map.get(id);
Spring IOC 核心设计模式
1、单例-懒汉 饿汉 枚举 防止反射
2、工厂设计模式(抽象工厂)
3、xml解析技术
4、反射技术
5、自定义注解
6、策略模式
Spring IOC 实例化
Spring IOC 依赖注入(DI)手动装配
set注入
Sping IOC内部通过set方法实现Bean对象注入
1、添加属性set方法
public class RoleService {
private UserService userService;
private AccountService at;
private String roleName;
private Integer age;
private String host;
private Integer port;
public void setPort(Integer port) {
this.port = port;
}
public void setHost(String host) {
this.host = host;
}
public void setAge(Integer age) {
this.age = age;
}
public void setRoleName(String roleName) {
this.roleName = roleName;
}
public void setAt(AccountService at) {
this.at = at;
}
public void setUserService(UserService userService) {
this.userService = userService;
}
public void test01(){
System.out.println("roleService.test01..."+roleName+","+age+","+host+","+port);
userService.test();
at.test();
}
}
2、加入Bean标签 的子标签 property
<!---
对象的依赖注入
name:属性名称值
ref:当前属性名对应的Bean 对象 目标对象的唯一标识
-->
<bean id="roleService" class="com.shsxt.service.RoleService">
<property name="userService" ref="userService"></property>
<property name="at" ref="accountService"></property>
<property name="roleName" value="admin"></property>
<property name="age" value="20"></property>
<property name="host" value="192.168.10.20"></property>
<property name="port" value="25"></property>
</bean>
<bean id="userService" class="com.shsxt.service.UserService"></bean>
<bean id="accountService" class="com.shsxt.service.AccountService"></bean>
构造器注入
1、提供带参构造方法
2、添加bean标签子标签 constructor-arg标签 name ref(同set注入)可能会出现循环引用 解决方案使用set注入
静态工厂
特点:
I、要有该工厂类及工厂方法
2、工厂方法为静态的
静态工厂定义
package com.shsxt.factory;
import com.shsxt.service.UserService;
public class StaticFactory {
public static UserService createUserService(){
return new UserService();
}
}
Bean 配置
<bean id="userService" class="com.shsxt.factory.StaticFactory"
factory-method="createUserService"/>
当我们指定 Spring 使用静态工厂方法来创建 Bean 实例时,Spring 将先
解析配置文件,并根据配置文件指定的信息,通过反射调用静态工厂类的静态
工厂方法,并将该静态工厂方法的返回值作为 Bean 实例,在这个过程中,
Spring 不再负责创建 Bean 实例,Bean 实例是由用户提供的静态工厂方法提供
的
实例化工厂
相比较静态工厂实现
I、工厂方法为非静态方法
2、.需要配置工厂 bean,并在业务 bean 中配置 factory-bean,factory-method 属性
实例化工厂定义
package com.shsxt.factory;
import com.shsxt.service.UserService;
public class InstanceFactory {
public UserService createUserService(){
return new UserService();
}
}
Bean 配置
<!--
实例化工厂
1.定义实例化工厂 bean
2.引用工厂 bean 指定工厂创建方法(方法为非静态)
-->
<bean id="instanceFactory" class="com.shsxt.factory.InstanceFactory"></bean>
<bean id="userService" factory-bean="instanceFactory" factorymethod="createUserService"></bean>
spring 三种实例化 bean 的方式比较
方式一:
通过 bean 的缺省构造函数创建,当各个 bean 的业务逻辑相互比较独立的时候或者和外界关联较少的时候可以使用
方式二:
利用静态 factory 方法创建,可以统一管理各个 bean 的创建,如各个 bean在创建之前需要相同的初始化处理,则可用这个 factory 方法险进行统一的处理等等
方式三:
利用实例化 factory 方法创建,即将 factory 方法也作为了业务 bean 来控制,
1 可用于集成其他框架的 bean 创建管理方法,
2 能够使 bean 和 factory 的角色互换
开发中项目一般使用一种方式实例化 bean,项目开发基本采用第一种方式,交
给 spring 托管,使用时直接拿来使用即可
本文详细探讨了Spring框架中单元测试时遇到的Bean注入问题,从Spring的基本概念到框架模块划分,深入剖析了Spring的IOC容器实现思路,包括依赖注入的多种方式,如set注入和构造器注入,以及静态工厂和实例化工厂的使用。同时,文章还介绍了Spring环境搭建的步骤,帮助读者理解如何在实际项目中解决Bean注入问题。

559

被折叠的 条评论
为什么被折叠?



