广州企业建站系统模板,h5自适应网站模板下载,设计上海展会2023,wordpress用户管理解决方案1.Spring概述
1.1 Spring是什么
Spring是分层的 Java SE/EE应用 full-stack(全栈式) 轻量级开源框架。
提供了表现层 SpringMVC和持久层 Spring JDBC Template以及 业务层 事务管理等众多的企业级应用 技术#xff0c;还能整合开源世界众多著名的第三方框架和类库#xf…1.Spring概述
1.1 Spring是什么
Spring是分层的 Java SE/EE应用 full-stack(全栈式) 轻量级开源框架。
提供了表现层 SpringMVC和持久层 Spring JDBC Template以及 业务层 事务管理等众多的企业级应用 技术还能整合开源世界众多著名的第三方框架和类库逐渐成为使用最多的Java EE 企业应用开源框架。
两大核心以 IOCInverse Of Control控制反转和 AOPAspect Oriented Programming面向切面编程为内核。
1.2 Spring发展历程
* EJB1997 年IBM提出了EJB 的思想1998 年SUN制定开发标准规范 EJB1.01999 年EJB1.1 发布2001 年EJB2.0 发布2003 年EJB2.1 发布2006 年EJB3.0 发布
* SpringRod Johnson Spring 之父改变Java世界的大师级人物2002年编著《Expert one on one J2EE design and development》指出了JavaEE和EJB组件框架中的存在的一些主要缺陷提出普通java类依赖注入更为简单的解决方案。2004年编著《Expert one-on-one J2EE Development without EJB》阐述了JavaEE开发时不使用EJB的解决方式Spring 雏形同年4月spring1.0诞生
2006年10月发布 Spring2.0
2009年12月发布 Spring3.0
2013年12月发布 Spring4.0
2017年9月 发布最新 Spring5.0 通用版GA1.3 Spring优势
1方便解耦简化开发Spring就是一个容器可以将所有对象创建和关系维护交给Spring管理什么是耦合度对象之间的关系通常说当一个模块(对象)更改时也需要更改其他模块(对象)这就是耦合耦合度过高会使代码的维护成本增加。要尽量解耦
2AOP编程的支持Spring提供面向切面编程方便实现程序进行权限拦截运行监控等功能。
3声明式事务的支持通过配置完成事务的管理无需手动编程
4方便测试降低JavaEE API的使用Spring对Junit4支持可以使用注解测试
5方便集成各种优秀框架不排除各种优秀的开源框架内部提供了对各种优秀框架的直接支持1.4 Spring体系结构 2.初识IOC
2.1 概述
控制反转Inverse Of Control不是什么技术而是一种设计思想。它的目的是指导我们设计出更 加松耦合的程序。 控制在java中指的是对象的控制权限创建、销毁 反转指的是对象控制权由原来 由开发者在类中手动控制 反转到 由Spring容器控制 举个例子 * 传统方式 之前我们需要一个userDao实例需要开发者自己手动创建 new UserDao();
* IOC方式 现在我们需要一个userDao实例直接从spring的IOC容器获得对象的创建权交给了spring控制 2.2 自定义IOC容器
2.2.1 介绍
需求
实现service层与dao层代码解耦合
步骤分析
1. 创建java项目导入自定义IOC相关坐标
2. 编写Dao接口和实现类
3. 编写Service接口和实现类
4. 编写测试代码
2.2.2 实现
1创建java项目导入自定义IOC相关坐标
dependenciesdependencygroupIddom4j/groupIdartifactIddom4j/artifactIdversion1.6.1/version/dependencydependencygroupIdjaxen/groupIdartifactIdjaxen/artifactIdversion1.1.6/version/dependencydependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion4.12/version/dependency
/dependencies
2编写Dao接口和实现类
public interface UserDao {public void save();
}
public class UserDaoImpl implements UserDao {public void save() {System.out.println(保存成功了...);}
}
3编写Service接口和实现类
public interface UserService {public void save();
}public class UserServiceImpl implements UserService {private UserDao userDao;public void save(){userDao new UserDaoImpl();userDao.save();}
}
4编写测试代码
public class UserTest {Testpublic void testSave() throws Exception {UserService userService new UserServiceImpl();userService.save();}
}
5问题
当前service对象和dao对象耦合度太高而且每次new的都是一个新的对象导致服务器压力过大。 解耦合的原则是编译期不依赖而运行期依赖就行了。 把所有需要创建对象的信息定义在配置文件中
?xml version1.0 encodingUTF-8 ?
beansbean iduserDao classcom.aaa.dao.impl.UserDaoImpl/bean
/beans 7编写BeanFactory工具类
public class BeanFactory {/* 声明集合用来保存bean */private static MapString, Object ioc new HashMap();static {try {/* 1.读取配置文件 */InputStream in BeanFactory.class.getClassLoader().getResourceAsStream(beans.xml);/* 2.解析xml */SAXReader saxReader new SAXReader();Document document saxReader.read(in);/* 3.编写xpath表达式 */String xpath //bean;/* 4.获取所有的bean标签 */ListElement list document.selectNodes(xpath);/* 5.遍历并创建对象实例设置到map集合中 */for (Element element : list) {String id element.attributeValue(id);String className element.attributeValue(class);Object object Class.forName(className).newInstance();ioc.put(id, object);}} catch (Exception e) {e.printStackTrace();}}// 获取指定id的对象实例public static Object getBean(String beandId) {return ioc.get(beandId);}
}
8修改UserServiceImpl实现类
public class UserServiceImpl implements UserService {private UserDao userDao;public void save() throws Exception{userDao (UserDao) BeanFactory.getBean(userDao);userDao.save();}
}
2.2.3 知识小结
* 其实升级后的BeanFactory就是一个简单的Spring的IOC容器所具备的功能。
* 之前我们需要一个userDao实例需要开发者自己手动创建 new UserDao();
* 现在我们需要一个userdao实例直接从spring的IOC容器获得对象的创建权交给了spring控制
* 最终目标代码解耦合3.Spring快速入门
3.1 介绍
需求借助spring的IOC实现service层与dao层代码解耦合
步骤分析
1. 创建java项目导入spring开发基本坐标
2. 编写Dao接口和实现类
3. 创建spring核心配置文件
4. 在spring配置文件中配置 UserDaoImpl
5. 使用spring相关API获得Bean实例3.2 实现
1创建java项目导入spring开发基本坐标
dependenciesdependencygroupIdorg.springframework/groupIdartifactIdspring-context/artifactIdversion5.1.5.RELEASE/version/dependencydependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion4.12/version/dependency
/dependencies 2编写Dao接口和实现类 public interface UserDao {public void save();
}public class UserDaoImpl implements UserDao {public void save() {System.out.println(保存成功了...);}
} 3创建spring核心配置文件 applicationContext.xml
?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd
/beans4在spring配置文件中配置 UserDaoImpl
//详细内容 见上3
beans ...bean iduserDao classcom.aaa.dao.impl.UserDaoImpl/bean
/beans 5使用spring相关API获得Bean实例
public class UserTest {Testpublic void testSave() throws Exception {/* 加载同时保存bean 到容器中 */ApplicationContext applicationContext new ClassPathXmlApplicationContext(applicationContext.xml);/* 直接从容器中获取 */UserDao userDao (UserDao) applicationContext.getBean(userDao);userDao.save();}
}3.3 知识小结
Spring的开发步骤
1. 导入坐标
2. 创建Bean
3. 创建applicationContext.xml
4. 在配置文件中进行Bean配置
5. 创建ApplicationContext对象执行getBean4.Spring相关API
4.1 API继承体系介绍
Spring的API体系异常庞大我们现在只关注两个BeanFactory和ApplicationContext 4.2 BeanFactory
BeanFactory是 IOC 容器的核心接口它定义了IOC的基本功能。 特点在第一次调用getBean()方法时创建指定对象的实例 Test
public void test2(){/* 核心接口不会创建bean对象存到容器中 */BeanFactory xmlBeanFactory new XmlBeanFactory(
new ClassPathResource(applicationContext.xml));/* getBean的时候才真正创建bean对象 */
IUserDao userDao (IUserDao) xmlBeanFactory.getBean(userDao);userDao.save();
} 4.3 ApplicationContext
代表应用上下文对象可以获得spring中IOC容器的Bean对象。 特点在spring容器启动时加载并创建所有对象的实例 常用实现类 1. ClassPathXmlApplicationContext
它是从类的根路径下加载配置文件 推荐使用这种。
2. FileSystemXmlApplicationContext 它是从磁盘路径上加载配置文件配置文件可以在磁盘的任意位置。
3. AnnotationConfigApplicationContext 当使用注解配置容器对象时需要使用此类来创建 spring 容器。它用来读取注解。测试代码
Test
public void test1(){/* 获取到了spring上下文对象借助上下文对象可以获取到IOC容器中的bean对象 ,加载的同时就创建了bean对象存到容器中 */ApplicationContext classPathXmlApplicationContext new ClassPathXmlApplicationContext(applicationContext.xml);//ApplicationContext fileSystemXmlApplicationContext new FileSystemXmlApplicationContext(D:\\xxx\\xxx\\src\\main\\resources\\applicationContext.xml);/* 使用上下文对象从IOC容器中获取到了bean对象1.根据beanid在容器中找对应的bean对象 *///IUserDao userDao (IUserDao) classPathXmlApplicationContext.getBean(userDao);/*2.根据类型在容器中进行查询有可能报错的情况根据当前类型匹配到多个实例 */IUserDao userDao classPathXmlApplicationContext.getBean(userDao,IUserDao.class);/* 调用方法 */userDao.save();}常用方法 1. Object getBean(String name);根据Bean的id从容器中获得Bean实例返回是Object需要强转。
2. T T getBean(ClassT requiredType);根据类型从容器中匹配Bean实例当容器中相同类型的Bean有多个时则此方法会报错。
3. T T getBean(String name,ClassT requiredType);根据Bean的id和类型获得Bean实例解决容器中相同类型Bean有多个情况。 5.Spring配置文件 5.1 Bean标签基本配置 bean id class/bean
* 用于配置对象交由Spring来创建。
* 基本属性idBean实例在Spring容器中的唯一标识classBean的全限定名
* 默认情况下它调用的是类中的 无参构造函数如果没有无参构造函数则不能创建成功。5.2 Bean标签范围配置 bean id class scope/beanscope属性指对象的作用范围取值如下 1. 当scope的取值为singleton时 Bean的实例化个数1个 Bean的实例化时机当Spring核心文件被加载时实例化配置的Bean实例 Bean的生命周期 对象创建当应用加载创建容器时对象就被创建了 对象运行只要容器在对象一直活着 对象销毁当应用卸载销毁容器时对象就被销毁了 2. 当scope的取值为prototype时 Bean的实例化个数多个 Bean的实例化时机当调用getBean()方法时实例化Bean Bean的生命周期 对象创建当使用对象时创建新的对象实例 对象运行只要对象在使用中就一直活着 对象销毁当对象长时间不用时被 Java 的垃圾回收器回收了 5.3 Bean生命周期配置 bean id class scope init-method destroy-method/bean
* init-method指定类中的初始化方法名称
* destroy-method指定类中销毁方法名称如 bean iduserDao classcom.aaa.dao.impl.UserDaoImpl init-methodinit destroy-methoddestroy/bean public class UserDaoImpl implements UserDao {public void save() {System.out.println(保存成功了...);}public void init(){System.out.println(init);}public void destroy(){System.out.println(destroy);}
} 5.4 Bean实例化三种方式
无参构造方法实例化工厂静态方法实例化工厂普通方法实例化 5.4.1 无参构造方法实例化
它会根据默认无参构造方法来创建类对象如果bean中没有默认无参构造函数将会创建失败 bean iduserDao classcom.aaa.dao.impl.UserDaoImpl/5.4.2 工厂静态方法实例化
应用场景 依赖的jar包中有个A类A类中有个静态方法m1m1方法的返回值是一个B对象。如果我们频繁使用 B对象此时我们可以将B对象的创建权交给spring的IOC容器以后我们在使用B对象时无需调用A类 中的m1方法直接从IOC容器获得。 public class StaticFactoryBean {public static UserDao createUserDao(){return new UserDaoImpl();}
} bean iduserDao classcom.aaa.factory.StaticFactoryBean
factory-methodcreateUserDao / 5.4.3 工厂普通方法实例化 应用场景
依赖的jar包中有个A类A类中有个普通方法m1m1方法的返回值是一个B对象。如果我们频繁使用 B对象
此时我们可以将B对象的创建权交给spring的IOC容器以后我们在使用B对象时无需调用A类中的m1 方法直接从IOC容器获得。 public class DynamicFactoryBean {public UserDao createUserDao(){return new UserDaoImpl(); }
} bean iddynamicFactoryBean classcom.aaa.factory.DynamicFactoryBean/
bean iduserDao factory-beandynamicFactoryBean factory-methodcreateUserDao/ 5.5 Bean依赖注入概述 依赖注入 DIDependency Injection它是 Spring 框架核心 IOC 的具体实现。 在编写程序时通过控制反转把对象的创建交给了 Spring但是代码中不可能出现没有依赖的情况。IOC 解耦只是降低他们的依赖关系但不会消除。例如业务层仍会调用持久层的方法。 那这种业务层和持久层的依赖关系在使用 Spring 之后就让 Spring 来维护了。简单的说就是通 过框架把持久层对象传入业务层而不用我们自己去获取。 5.6 Bean依赖注入方式 5.6.1 构造方法
在UserServiceImpl中创建有参构造 public class UserServiceImpl implements UserService {private UserDao userDao;public UserServiceImpl(UserDao userDao) {this.userDao userDao;}Overridepublic void save() {userDao.save();}
}
配置Spring容器调用有参构造时进行注入 bean iduserDao classcom.aaa.dao.impl.UserDaoImpl/
bean iduserService classcom.aaa.service.impl.UserServiceImpl
!-- constructor-arg index0 typecom.aaa.dao.UserDao refuserDao/ --
constructor-arg nameuserDao refuserDao/
/bean 测试 ApplicationContext classPathXmlApplicationContext
new ClassPathXmlApplicationContext(applicationContext.xml);
UserService userService
(UserService) classPathXmlApplicationContext.getBean(userService);
userService.save(); 5.6.2 set方法
在UserServiceImpl中创建set方法 public class UserServiceImpl implements UserService {private UserDao userDao;public void setUserDao(UserDao userDao) {this.userDao userDao;}Overridepublic void save() {userDao.save();}
}配置Spring容器调用set方法进行注入 bean iduserDao classcom.aaa.dao.impl.UserDaoImpl/
bean iduserService classcom.aaa.service.impl.UserServiceImplproperty nameuserDao refuserDao/
/bean 5.6.3 P命名空间注入(了解)
P命名空间注入本质也是set方法注入但比起上述的set方法注入更加方便主要体现在配置文件 中如下
首先需要引入P命名空间 xmlns:phttp://www.springframework.org/schema/p 其次需要修改注入方式 bean iduserDao classcom.aaa.dao.impl.UserDaoImpl/
bean iduserService classcom.aaa.service.impl.UserServiceImpl
p:userDao-refuserDao/ 5.7 Bean依赖注入的数据类型
上面操作都是注入Bean对象除了对象的引用可以注入普通数据类型和集合都可以在容器中进行注入。 注入数据的三种数据类型 1. 普通数据类型
2. 引用数据类型
3. 集合数据类型 其中引用数据类型此处就不再赘述了之前的操作都是对UserDao对象的引用进行注入的。下面将 以set方法注入为例演示普通数据类型和集合数据类型的注入。 5.7.1 注入普通数据类型 public class User {private String username;private String age;public void setUsername(String username) {this.username username;}public void setAge(String age) {this.age age;}
} bean iduser classcom.aaa.domain.Userproperty nameusername valuefyh/property nameage value18/
/bean 测试 ApplicationContext classPathXmlApplicationContext new ClassPathXmlApplicationContext(applicationContext.xml);User user classPathXmlApplicationContext.getBean(user,User.class);
System.out.println(user); 5.7.2 注入集合数据类型
1List集合注入 public class UserDaoImpl implements UserDao {private ListObject list;public void setList(ListObject list) {this.list list;} public void save() {System.out.println(list);System.out.println(保存成功了...);}
} bean iduser classcom.aaa.domain.Userproperty nameusername valuejack/property nameage value18/
/bean
bean iduserDao classcom.aaa.dao.impl.UserDaoImplproperty namelistlistvalueaaa/valueref beanuser/ref/list/property
/bean 2Set集合注入
public class UserDaoImpl implements UserDao {private SetObject set;public void setSet(SetObject set) {this.set set;}public void save() {System.out.println(set);System.out.println(保存成功了...);}
}bean iduser classcom.aaa.domain.Userproperty nameusername valuejack/property nameage value18//beanbean iduserDao classcom.aaa.dao.impl.UserDaoImplproperty namesetsetvaluebbb/valueref beanuser/ref/set/property
/bean 3Array数组注入 public class UserDaoImpl implements UserDao {private Object[] array;public void setArray(Object[] array) {this.array array;}public void save() {System.out.println(Arrays.toString(array));System.out.println(保存成功了...);}
}bean iduser classcom.aaa.domain.Userproperty nameusername valuejack/property nameage value18/
/bean
bean iduserDao classcom.aaa.dao.impl.UserDaoImplproperty namearrayarrayvalueccc/valueref beanuser/ref/array/property
/bean 4Map集合注入
public class UserDaoImpl implements UserDao {private MapString, Object map;public void setMap(MapString, Object map) {this.map map;}public void save() {System.out.println(map);System.out.println(保存成功了...);}
}
bean iduser classcom.aaa.domain.Userproperty nameusername valuejack/property nameage value18/
/bean
bean iduserDao classcom.aaa.dao.impl.UserDaoImplproperty namemapmapentry keyk1 valueddd/entry keyk2 value-refuser/entry/map/property
/bean5Properties配置注入 public class UserDaoImpl implements UserDao {private Properties properties;public void setProperties(Properties properties) {this.properties properties;}public void save() {System.out.println(properties);System.out.println(保存成功了...);}
}bean iduserDao classcom.aaa.dao.impl.UserDaoImplproperty namepropertiespropsprop keyk1v1/propprop keyk2v2/propprop keyk3v3/prop/props/property
/bean5.8 配置文件模块化
实际开发中Spring的配置内容非常多这就导致Spring配置很繁杂且体积很大所以可以将部分 配置拆解到其他配置文件中也就是所谓的配置文件模块化。 1并列的多个配置文件 ApplicationContext act new ClassPathXmlApplicationContext(beans1.xml,beans2.xml,...); 2主从配置文件 import resourceapplicationContext-xxx.xml/ 注意 同一个xml中不能出现相同名称的bean,如果出现会报错 多个xml如果出现相同名称的bean不会报错但是后加载的会覆盖前加载的bean 5.9 知识小结
bean标签创建对象并放到spring的IOC容器id属性:在容器中Bean实例的唯一标识不允许重复class属性:要实例化的Bean的全限定名scope属性:Bean的作用范围常用是Singleton(默认)和prototype
constructor-arg标签属性注入name属性属性名称value属性注入的普通属性值ref属性注入的对象引用值
property标签属性注入name属性属性名称value属性注入的普通属性值ref属性注入的对象引用值listsetarraymapprops
import标签:导入其他的Spring的分文件