尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Spring全面详解(基础版)

Spring全面详解(基础版) 文章目录*一、Spring简介* * 1.1 Spring是什么 * 1.2 Spring的优势 * 1.3 Spring的体系结构* 二、Spring快速入门* * 2.1Spring程序开发步骤与原始步骤相比较 * 2.2 Sping程序开发步骤第一个Spring程序* 三、Spring相关API* * 3.1 ApplicationContext * 3.2 getBean()方法* 四、Spring配置文件* * 4.1 Bean标签基本配置 * 4.2 Bean标签范围配置 * 4.3 Bean生命周期配置 * 4.4 Bean实例化四种方式 * **4.5 Bean的依赖注入 * * 4.5.1 依赖注入的概念 * 4.5.2 Bean依赖注入入门例子 * 4.5.3 Bean的依赖注入方式 * 4.5.4 Bean依赖注入的数据类型 * * 4.5.4.1普通数据类型的注入 * 4.5.4.2 集合数据类型的注入 * 4.6 引入其他配置文件分模块开发* 五、Spring注解开发* * 5.1 Spring原始注解 * 5.2 Spring新注解* 六、Spring集成Junit* * 6.1 问题引入 * 6.2 Spring集成Junit步骤一、Spring简介----------### 1.1 Spring是什么Spring是分层的Java SE/EE应用full-stack轻量级开源框架以IOC(Inverse Of Control反转控制)和AOP(Aspect Oriented Programming面向切面编程)为内核。提供了展现层SpringMVC和持久层SpringJDBCTemplate以及业务层事务管理等众多的企业级应用技术还能整合开源世界众多著名的第三方框架和类库逐渐成为使用最多的JavaEE企业应用开源框架。### 1.2 Spring的优势**1方便解耦简化开发通过 Spring 提供的 IOC 容器可以将对象间的依赖关系交由 Spring 进行控制避免硬编码所造成的过度耦合。用户也不必再为单例模式 类、属性文件解析等这些很底层的需求编写代码可以更专注于上层的应用。2AOP编程的支持通过 Spring的 AOP 功能方便进行面向切面编程许多不容易用传统 OOP 实现的功能可以通过 AOP 轻松实现。3声明式事务的支持可以将我们从单调烦闷的事务管理代码中解脱出来通过声明式方式灵活的进行事务管理提高开发效率和质量。4方便程序的测试可以用非容器依赖的编程方式进行几乎所有的测试工作测试不再是昂贵的操作而是随手可做的事情。5方便继承各种优秀框架Spring对各种优秀框架Struts、Hibernate、Hessian、Quartz等的支持。6降低JavaEEAPI的使用难度Spring对 JavaEE API如 JDBC、JavaMail、远程调用等进行了薄薄的封装层使这些 API 的使用难度大为降低。7Java源码是经典学习范例Spring的源代码设计精妙、结构清晰、匠心独用处处体现着大师对Java 设计模式灵活运用以及对 Java技术的高深造诣。它的源代码无意是 Java 技术的最佳实践的范例。### 1.3 Spring的体系结构如上图所示Spring 由多个模块组成它们可以分为核心容器Core Container、数据访问/集 成Data Access/Integration、Web、面向切面编程AOP, Aspect Oriented Programming、设备Instrumentation、消息发送Messaging和测试Test。二、Spring快速入门------------### 2.1Spring程序开发步骤与原始步骤相比较1不使用Spring**2使用Spring### 2.2 Sping程序开发步骤第一个Spring程序第一步创建一个普通得maven项目项目名称为SpringDemo第二步导入Spring开发的基本包坐标org.springframework spring-context 5.2.9.RELEASE第三步编写Dao接口和实现类package org.example.dao; public interface UserDao { public void save(); }package org.example.dao.impl; import org.example.dao.UserDao; public class UserDaoImpl implements UserDao { Override public void save() { System.out.println(“UserDao’s save method is running…”); } }第四步创建Spring核心配置文件在类路径resources下创建applicationContext.xml配置文件?xml version1.0 encodingUTF-8?第五步在Spring配置文件中配置UserDaoImpl第六步测试使用Spring的API获得Bean实例Test public void testFirstIocDemo() { //读取核心配置文件加载应用上下文可通过其获得Spring容器中的Bean对象 ApplicationContext app new ClassPathXmlApplicationContext(“applicationContext.xml”); //通过getBean方法获取容器内的bean对象 UserDao userDao (UserDao) app.getBean(“userDao”); //调用userDao的save方法 userDao.save(); }三、Spring相关API-------------### 3.1 ApplicationContextapplicationContext接口类型代表应用上下文可以通过其实例获得 Spring 容器中的 Bean 对象。其实现类有以下三个*ClassPathXmlApplicationContext它是从类的根路径下加载配置文件 推荐使用这种 *FileSystemXmlApplicationContext 它是从磁盘路径上加载配置文件配置文件可以在磁盘的任意位置。 *AnnotationConfigApplicationContext当使用注解配置容器对象时需要使用此类来创建 spring 容器。它用来读取注解。 ### 3.2 getBean()方法 //第一种当参数的数据类型是字符串时表示根据Bean的id从容器中获得Bean实例返回是Object需要强转 public Object getBean(String name) throws BeansException assertBeanFactoryActive(); return getBeanFactory().getBean(name); } //第二种当参数的数据类型是Class类型时表示根据类型从容器中匹配Bean实例当容器中相同类型的Bean有多个时则此方法会报错 public T getBean(Class requiredType) throws BeansException { assertBeanFactoryActive(); return getBeanFactory().getBean(requiredType); } 四、Spring配置文件------------### 4.1 Bean标签基本配置bean标签用于配置对象交由Spring来创建默认情况下它调用的是类中的无参构造器如果没有无参构造函数则不能创建成功。基本属性1idBean实例在Spring容器中的唯一标识**2class**Bean的全限定名称### 4.2 Bean标签范围配置scope指对象的作用范围取值如下取值范围说明singleton默认值单例的prototype****多例的requestWEB 项目中Spring 创建一个 Bean 的对象将对象存入到 request 域中sessionWEB 项目中Spring 创建一个 Bean 的对象将对象存入到 session 域中global sessionWEB 项目中应用在 Portlet 环境如果没有 Portlet 环境那么globalSession 相当于 session1当scope的取值为singleton时Bean的实例化个数1个Bean的实例化时机当Spring核心文件被加载时实例化配置的Bean实例Bean的生命周期对象创建当应用加载创建容器时对象就被创建了对象运行只要容器在对象一直活着对象销毁当应用卸载销毁容器时对象就被销毁了2当scope的支取为prototype时Bean的实例化个数多个Bean的实例化时机当调用getBean()方法时实例化BeanBean的生命周期对象创建当使用对象时创建新的对象实例对象运行只要对象在使用中就一直活着对象销毁当对象长时间不用时被 Java 的垃圾回收器回收了### 4.3 Bean生命周期配置1init-method指定类中的初始化方法名称2destroy-method指定类中销毁方法名称### 4.4 Bean实例化四种方式#### * 无参构造方法实例化它会根据默认无参构造方法来创建类对象如果bean中没有默认无参构造函数将会创建失败 * 有参的构造方法实例化 * 工厂静态方法实例化 //工厂的静态方法返回Bean实例 public class StaticFactory { public static UserDao createUserDao() { return new UserDaoImpl(); } } * 工厂实例方法实例化 //工厂的非静态方法返回Bean实例 public class DynamicFactory { public UserDao createUserDao() { return new UserDaoImpl(); } } ### 4.5 Bean的依赖注入#### 4.5.1 依赖注入的概念依赖注入Dependency Injection它是 Spring 框架核心 IOC 的具体实现。在编写程序时通过控制反转把对象的创建交给了 Spring但是代码中不可能出现没有依赖的情况。IOC 解耦只是降低他们的依赖关系但不会消除。例如业务层仍会调用持久层的方法。那这种业务层和持久层的依赖关系在使用 Spring 之后就让 Spring 来维护了。简单的说就是坐等框架把持久层对象传入业务层而不用我们自己去获取。#### 4.5.2 Bean依赖注入入门例子* 创建业务逻辑接口UserService和其实现类UserServiceImpl在内部调用UserDao的save方法。 public class UserServiceImpl implements UserService { Override public void save() { //获取UserDao对象调用其save方法 //读取核心配置文件加载应用上下文可通过其获得Spring容器中的Bean对象 ApplicationContext app new ClassPathXmlApplicationContext(“applicationContext.xml”); //通过getBean方法获取容器内的bean对象 UserDao userDao (UserDao) app.getBean(“userDao”); //调用userDao的save方法 userDao.save(); } } * 将UserServiceImpl的创建权交给Spring * 从Spring容器获得UserService进行操作 Test /测试依赖注入/ public void testDIDemo() { ApplicationContext app new ClassPathXmlApplicationContext(“applicationContext.xml”); UserService userService (UserService) app.getBean(“userService”); userService.save(); } 分析上述代码中UserService实例和UserDao实例都存在与Spring容器中当前的做法是在容器外部获得UserService实例和UserDao实例然后在程序中进行结合。优化方案因为UserService和UserDao都在Spring容器中而最终程序直接使用的是UserService所以可以在Spring容器中将UserDao设置到UserService内部。问题怎么将UserDao注入到UserService内部呢#### 4.5.3 Bean的依赖注入方式**1方式一set方法*** 在UserServiceImpl中添加setUserDao方法 public class UserServiceImpl implements UserService { UserDao userDao; public void setUserDao(UserDao userDao) { this.userDao userDao; } Override public void save() { userDao.save(); } } * 配置Spring容器中调用set方法进行注入2方式二构造方法注入* 创建有参构造器 public class UserServiceImpl implements UserService { UserDao userDao; public UserServiceImpl(UserDao userDao) { this.userDaouserDao; } public UserServiceImpl() { } public void setUserDao(UserDao userDao) { this.userDao userDao; } Override public void save() { userDao.save(); } } * 配置Spring容器调用有参构造方法进行注入 #### 4.5.4 Bean依赖注入的数据类型上面的操作都是注入的引用Bean除了对象的引用可以注入普通数据类型集合等都可以在容器中进行注入。注入的类型可分为三种*普通数据类型*引用数据类型参考3.5.3 *集合数据类型##### 4.5.4.1普通数据类型的注入* 创建User类 public class User { private String name; private int age; private String address; public void setName(String name) { this.name name; } public void setAge(int age) { this.age age; } public void setAddress(String address) { this.address address; } Override public String toString() { return “User{” “name” name ‘’’ “, age” age “, address” address ‘’’ ‘}’; } } * 配置普通数据类型的属性注入 * 测试 Test /测试普通数据类型的注入/ public void testDIDemo2() { ApplicationContext app new ClassPathXmlApplicationContext(“applicationContext.xml”); User user (User) app.getBean(“user1”); System.out.println(user); } ##### 4.5.4.2 集合数据类型的注入1List的注入 public class UserDaoImpl implements UserDao { private List strList; public void setStrList(List strList) { this.strList strList; } Override public void save() { System.out.println(“strList”strList); System.out.println(“UserDao’s save method is running…”); } } 111 222 333 444 2List的注入 public class UserDaoImpl implements UserDao { private List userList; public void setUserList(List userList) { this.userList userList; } Override public void save() { System.out.println(“userList”userList); System.out.println(“UserDao’s save method is running…”); } } 3MapString,User的注入 public class UserDaoImpl implements UserDao { private MapString,User userMap; public void setUserMap(MapString, User userMap) { this.userMap userMap; } Override public void save() { System.out.println(“userMap”userMap); System.out.println(“UserDao’s save method is running…”); } } 4Properties的注入 public class UserDaoImpl implements UserDao { private Properties properties; public void setProperties(Properties properties) { this.properties properties; } Override public void save() { System.out.println(“properties”properties); System.out.println(“UserDao’s save method is running…”); } } aaa bbb ccc ### 4.6 引入其他配置文件分模块开发实际开发中Spring的配置内容非常多这就导致Spring配置很繁杂且体积很大所以可以将部分配置拆解到其他配置文件中而在Spring主配置文件通过import标签进行加载。 五、Spring注解开发------------### 5.1 Spring原始注解Spring是轻代码而重配置的框架配置比较繁重影响开发效率所以注解开发是一种趋势注解代替xml配置文件可以简化配置提高开发效率。Spring原始注解主要是替代的配置常用注解如下注解****说明Component使用在类上用于实例化BeanController使用在web层类上用于实例化BeanService使用在service层类上用于实例化BeanRepository使用在dao层类上用于实例化BeanAutowired使用在字段上用于根据类型依赖注入Qualifier结合Autowired一起使用用于根据名称进行依赖注入Resource相当于AutowiredQualifier按照名称进行注入Value注入普通属性Scope标注Bean的作用范围PostConstruct使用在方法上标注该方法是Bean的初始化方法PreDestroy使用在方法上标注该方法是Bean的销毁方法注意:使用注解进行开发时需要在applicationContext.xml中配置组件扫描作用是指定哪个包及其子包下的Bean需要进行扫描以便识别使用注解配置的类、字段和方法。 ?xml version1.0 encodingUTF-8? context:component-scan base-package“net.togogo”/context:component-scan ### 5.2 Spring新注解使用上面的注解还不能全部替代xml配置文件还需要使用注解替代的配置如下 非自定义的Bean的配置 加载properties文件的配置context:property-placeholder 组件扫描的配置context:component-scan 引入其他配置文件注解****说明Configuration用于指定当前类是一个 Spring 配置类当创建容器时会从该类上加载注解ComponentScan用于指定 Spring 在初始化容器时要扫描的包。 作用和在 Spring 的 xml 配置文件中的 context:component-scan base-package“com.itheima”/一样Bean使用在方法上标注将该方法的返回值存储到 Spring 容器中PropertySource用于加载.properties 文件中的配置Import用于导入其他配置类 Configuration ComponentScan(“net.togogo”) Import(SpringConfigTwo.class) public class SpringConfigOne { Bean(“myuser”) public User getUser() { return new User(); } } Configuration PropertySource(“classpath:test.properties”) public class SpringConfigTwo { Value(“u s e r n a m e ) p r i v a t e S t r i n g n a m e ; V a l u e ( {user_name}) private String name; Value(usern​ame)privateStringname;Value({user_age}”) private int age; Value(“${user_address}”) private String address; Bean(“userDao”) public UserDao getUserDao() { return new UserDaoImpl(name,age,address); } } Test /测试Spring的新注解/ public void testNewAnnotation() { ApplicationContext app new AnnotationConfigApplicationContext(SpringConfigOne.class); User myuser (User) app.getBean(“myuser”); System.out.println(myuser); UserDao userDao (UserDao) app.getBean(“userDao”); userDao.save(); } 六、Spring集成Junit---------------### 6.1 问题引入在测试类中每个测试方法都有以下两行代码 ApplicationContext app new ClassPathXmlApplicationContext(“applicationContext.xml”); User user (User) app.getBean(“user1”); 这两行代码的作用是获取容器如果不写的话直接会提示空指针异常。所以又不能轻易删掉。如何优化上述问题的解决思路让SpringJunit负责创建Spring容器但是需要将配置文件的名称告诉它将需要进行测试Bean直接在测试类中进行注入### 6.2 Spring集成Junit步骤①导入spring集成Junit的坐标 org.springframework spring-test 5.2.9.RELEASE junit junit 4.12 ②使用Runwith注解替换原来的运行期RunWith(SpringJUnit4ClassRunner.class)使用了Spring的SpringJUnit4ClassRunner以便在测试开始的时候自动创建Spring的应用上下文。③使用ContextConfiguration指定配置文件或配置类④使用Autowired注入需要测试的对象⑤创建测试方法进行测试 RunWith(SpringJUnit4ClassRunner.class) //加载核心配置文件或者核心配置类 //ContextConfiguration(value {“classpath:applicationContext.xml”}) ContextConfiguration(classes {SpringConfigOne.class}) public class SpringIOCTest { Autowired Qualifier(“myuser”) private User user; Autowired Qualifier(“userDao”) private UserDao userDao; Test public void testNewAnnotation() { System.out.println(user); userDao.save(); } }
返回列表