如何理解Java Spring框架与Spring IOC,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
学习目标
【应用】能够独立完成springIOC的快速入门
【应用】能够掌握spring的bean标签的配置
【应用】能够独立完成bean的对象属性注入
【应用】能够独立完成bean的普通属性注入
【理解】能够独立完成bean的集合属性注入
Spring是分层的 Java SE/EE应用 full-stack 轻量级开源框架,以 IoC(Inverse Of Control:反转控制)和AOP(Aspect Oriented Programming:面向切面编程)为内核。
提供了表现层 SpringMVC和持久层 Spring JDBCTemplate以及业务层事务管理等众多的企业级应用技术,还能整合开源世界众多著名的第三方框架和类库,逐渐成为使用最多的Java EE 企业应用开源框架。
1997 年, IBM提出了EJB 的思想
1998 年,SUN制定开发标准规范 EJB1.0
1999 年,EJB1.1 发布
2001 年,EJB2.0 发布
2003 年,EJB2.1 发布
2006 年,EJB3.0 发布
Rod Johnson 罗宾·约翰逊( Spring 之父)
Expert One-to-One J2EE Design and Development(2002) 阐述了 J2EE 使用EJB 开发设计的优点及解决方案
Expert One-to-One J2EE Development without EJB(2004) 阐述了 J2EE 开发不使用 EJB的解决方式(Spring 雏
形)
2021 年 7 月份发布了 Spring 的最新版本 Spring 5.3.9 通用版(正式发布的版本)
Spring 就是一个大工厂(IoC容器),可以将所有对象的创建和依赖关系的维护工作都交给 Spring 容器管理,大大地降低了组件之间的耦合性。
通过 Spring的 AOP 功能,方便进行面向切面编程,许多不容易用传统 OOP 实现的功能可以通过 AOP 轻松实现。
如 实现对程序进行权限拦截、运行监控等功能
可以将我们从单调烦闷的事务管理代码中解脱出来,通过声明式方式灵活的进行事务管理,提高开发效率和质量。
Spring对Junit4支持,可以通过注解方便的测试Spring程序,测试不再是昂贵的操作,而是随手可做的事情。
Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts、Hibernate、MyBatis、Quartz等)的直接支持。
Spring 对JavaEE开发中非常难用的一些API(JDBC、JavaMail、远程调用等),都提供了封装,使这些API应用难度大大降低。
Spring的源代码设计精妙、结构清晰、匠心独用,处处体现着大师对Java 设计模式灵活运用以及对 Java技术的高深造诣。它的源代码无意是 Java 技术的最佳实践的范例。
IoC:控制反转(Inversion Of Control) ,就是应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护是由外部容器负责的。这样控制权就由应用转移到了外部容器,控制权的转移就是所谓反转。
简单理解:把对象的创建、初始化、销毁等工作交给spring容器来做。由spring容器控制对象的生命周期。
明确 IoC的作用:削减计算机程序的耦合(解除我们代码中的依赖关系)。
原来:我们在获取对象时,都是采用 new 的方式。 是主动的。
现在:我们获取对象时,跟spring容器要,有spring为我们查找或者创建对象。 是被动的。
①导入 Spring 开发的基本包坐标
②编写 Dao 接口和实现类
③创建 Spring 核心配置文件
④在 Spring 配置文件中配置 UserDaoImpl
⑤使用 Spring 的 API 获得 Bean 实例
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring‐context</artifactId> <version>5.2.8.RELEASE</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependencies>
package com.summer.dao; public interface UserDao { public void save(); } package com.summer.dao.impl; import com.summer.dao.UserDao; public class UserDaoImpl implements UserDao { public void save() { System.out.println("用户添加~~~~~"); } }
在类路径 classpath 下(resources)创建applicationContext.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 http://www.springframework.org/schema/beans/spring‐beans.xsd"> </beans>
<?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"> <!‐‐ 实现IoC将对象的创建 交给spring容器 UserDao userDao = new UserDaoImpl(); ‐‐> <bean id="userDao" class="com.bailiban.dao.impl.UserDaoImpl"></bean> </beans>
public class TestIoC{ public static void main(String[] args) { // 创建spring容器实例 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); //从容器中获取 bean 根据 唯一标识id获取 UserDao userDao = (UserDao) context.getBean("userDao"); userDao.save(); } }
在类路径下寻找配置文件来实例化容器
Spring快速入门代码巩固练习
练习下通过springIoC的 XML配置方式来进行对象的实例化
\1. 导入坐标
\2. 创建Bean
\3. 创建配置文件applicationContext.xml
\4. 在配置文件中进行配置
\5. 创建ApplicationContext对象getBean
① 编写Dao,Service接口和实现类
public interface UserDao { public void save(); } public class UserDaoImpl implements UserDao { public void save() { System.out.println("用户添加~~~~~"); } } public interface UserService { public void save(); } public class UserServiceImpl implements UserService { public void save() { //TODO } }
②将UserDaoImpl 、 UserServiceImpl 的创建权交给 Spring
< !‐‐ spring IoC 将对象的创建权交给spring‐‐> <bean id="userDao" class="com.bailiban.dao.impl.UserDaoImpl"></bean> <bean id="userService" class="com.bailiban.service.impl.UserServiceImpl"></bean>
UserService 内部再调用 UserDao的save() 方法
public class UserServiceImpl implements UserService { public void save() { //创建spring容器实例 ApplicationContext context = new ClassPathXmlApplicationContext(); //根据id获取dao对象 UserDao userDao = (UserDao) context.getBean("userDao"); //调用方法 userDao.save(); } }
③从 Spring 容器中获得 UserService 进行操作
public class TestDI { //测试 DI快速入门 @Test public void test1() { //创建spring容器实例 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); //根据id获取dao对象 UserService userService = (UserService) context.getBean("userService"); //调用方法 userService.save(); } }
目前UserService实例和UserDao实例都存在与Spring容器中,当前的做法是在容器外部获得UserService实例和UserDao实例,然后在程序中进行结合。
因为UserService和UserDao都在Spring容器中,而最终程序直接使用的是UserService,所以可以在Spring容器中,将UserDao设置到UserService内部。
DI : Dependency Injection 依赖注入 , 需要有 IoC的环境,Spring 创建对象的过程中,Spring 将对象依赖的属性注入到对象。
在编写程序时,通过控制反转,把对象的创建交给了 Spring,但是代码中不可能出现没有依赖的情况。
IoC解耦只是降低他们的依赖关系,但不会消除。例如:业务层仍会调用持久层的方法。
那这种业务层和持久层的依赖关系,在使用 Spring 之后,就让 Spring 来维护了。
简单的说,就是坐等框架把持久层对象传入业务层,而不用我们自己去获取。
怎么将UserDao怎样注入到UserService内部呢?
在UserServiceImpl中添加setUserDao方法
public class UserServiceImpl implements UserService { // 定义dao成员变量 private UserDao userDao; public void setUserDao(UserDao userDao) { this.userDao = userDao; } public void save() { // //创建spring容器实例 // ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); // //根据id获取dao对象 // UserDao userDao = (UserDao) context.getBean("userDao"); // //调用方法 userDao.save(); } }
配置Spring容器调用set方法进行注入
<bean id="userDao" class="com.bailiban.dao.impl.UserDaoImpl"></bean> <bean id="userService" class="com.bailiban.service.impl.UserServiceImpl"> <!‐‐使用set方法注入 name: set方法去掉set后 首字母小写 ‐‐> <property name="userDao" ref="userDao"></property> </bean>
set方法:P命名空间注入
P命名空间注入本质也是set方法注入,但比起上述的set方法注入更加方便,主要体现在配置文件中,如下:
首先,需要引入P命名空间:
xmlns:p="http://www.springframework.org/schema/p"
其次,需要修改注入方式
<bean id="userService" class="com.bailiban.service.impl.UserServiceImpl" p:userDao‐ ref="userDao">
上面的操作,都是注入的引用Bean,除了对象的引用可以注入,普通数据类型 等都可以在容器中进行注入。
注入数据的二种数据类型
1.普通数据类型
2.引用数据类型
其中引用数据类型,此处就不再赘述了,之前的操作都是对UserDao对象的引用进行注入的,下面将以set方法注入为例,演示普通数据类型的注入。
Bean的依赖注入的数据类型
(1)普通数据类型的注入
练习:
public class UserDaoImpl implements UserDao { //普通数据类型的注入 private String name; private int age; public void setName(String name) { this.name = name; } public void setAge(int age) { this.age = age; } public void save() { System.out.println(name+"‐‐‐"+age); System.out.println("用户添加~~~~~"); } }
<bean id="userDao" class="com.bailiban.dao.impl.UserDaoImpl"> <!‐‐ 普通数据的注入 ‐‐> <property name="name" value="旺财"></property> <property name="age" value="18"></property> </bean>
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。