Spring框架之初识Spring框架
什么是Spring框架?
- Spring是分层的
JavaSE/EE full-stack
轻量级开源框架,以IoC(Inverse of Control 控制反转)
和AOP(Aspect Oriented Programming 面向切面编程)
为内核,使用基本的的JavaBean
来暗处以前只可能由EJB
完成的工作,取代了EJB
的臃肿、低效的开发模式。 - 在实际开发中,通常服务器端在采用三层体系架构,分别为
表示层(Web)、业务逻辑层(Service)、持久层(Dao)
, Spring对每一层都提供了技术支持。
Spring框架的优点
- 非侵入式设计
- 方便解耦、简化开发
- 支持AOP(面向切面编程)
- 支持声明事务处理
- 方便程序测试
- 方便集成各种优秀框架
- 降低 Java EE API 的使用难度
Spring的下载及目录结构
-
Spring框架包
下载地址:https://repo.spring.io/simple/libs-release-local/org/springframework/spring
-
文件分类格式
- 以
.RELEASE.jar
结尾的是class文件jar包 - 以
.RELEASE-javadoc.jar
结尾的是API文档压缩包 - 以
.RELEASE-sources.jar
结尾的是源文件压缩包
- 以
-
Spring的四个基础包以及一个第三方依赖包
- spring-core-4.3.6.RELEASE.jar
包含Spring框架的核心工具类,Spring其它组件都要用到这个包里的类。 - spring-beans-4.3.6.RELEASE.jar
所有应用都要用到的JAR包,它包含访问配置文件、创建和管理Bean以及进行控制反转或者依赖注入操作相关的所有类。 - spring-context-4.3.6.RELEASE.jar
提供了在基础IoC功能上的扩展服务,还提供了许多企业级服务的支持 - spring-expression-4.3.6.RELEASE.jar
定义了Spring的表达式语言。 - 在使用Spring开发的时候,不仅要使用自带的jar包,Spring的核心容易还需要依赖于commons.logging的jar包(单击下载)
- spring-core-4.3.6.RELEASE.jar
Spring的核心容器
-
Spring容器会负责控制程序之间的关系,而不是由程序代码直接控制。Spring为我们提供了两种核心容器,分别为
BeanFactory
和ApplicationContext
-
BeanFactory:创建BeanFactory实例时,需要提供Spring所管理容器的详细配置信息,这些信息通常采用XML文件形式来管理,其加载配置信息的语法如下:
BeanFactory beanFactory = new XmlBeanFactory(new FileSystemResource("F: /applicationContext.xml"));
-
ApplicationContext:ApplicationContext是BeanFactory的子接口,是另一种常用的Spring核心容器。它由org.springframework.context.ApplicationContext接口定义,不仅包含了BeanFactory的所有功能,还添加了对国际化、资源访问、事件传播等方面的支持。创建ApplicationContext接口实例,通常采用两种方法,具体如下:
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(String configLocation);
ClassPathXmlApplicationContext会从类路径classPath中寻找指定的XML配置文件,找到并装载完成ApplicationContext的实例化工作。
ApplicationContext applicationContext = new FileSystemXmlApplicationContext(String configLocation);
FileSystemXmlApplicationContext会从指定的文件系统路径(绝对路径)中寻找指定的XML配置文件,找到并装载完成ApplicationContext的实例化工作。
在Java项目中,会通过ClassPathXmlApplicationContext类来实例化ApplicationContext容器。而在Web项目中,ApplicationContext容器的实例化工作会交由Web服务器来完成。
Web服务器实例化ApplicationContext容器时,通常会使用ContextLoaderListener来实现,此种方式只需要在web.xml中添加如下代码:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:spring/applicationContext.xml
</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
Spring的入门程序
-
创建java web项目(我这里是采用IDEA创建的)(IDEA创建java web项目请参考 这篇CSDN文章)
-
导入四个基础jar包和一个Spring依赖jar包(IDEA导入jar包方法请参考 这篇文章)
-
正式开始:创建一个包
vip.ruoli.Spring
并创建接口userDao,然后在接口中定义一个say()方法。package vip.ruoli.Spring; /** * @author 若离 * @date 2020/9/14 20:27 */ public interface UserDao { public void say(); }
-
之后创建类UserDaoImp用来实现接口UserDao,代码如下:
package vip.ruoli.Spring; /** * @author 若离 * @date 2020/9/14 20:28 */ public class UserDaoImp implements UserDao{ @Override public void say() { System.out.println("userDao say that \"It is Ok.\""); } }
-
最后在src目录下创建Spring的配置文件
applicationContext.xml
,并在文件中配置一个id为userDao的Bean。<?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-4.3.xsd"> <bean id="userDao" class="com.itheima.ioc.UserDaoImpl" /> </beans>
-
最后我们创建测试类TestDao测试一下效果
package vip.ruoli.Spring; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; /** * @author 若离 * @date 2020/9/14 20:30 */ public class TestDao { public static void main(String[] args) { ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml"); UserDao userDao=(UserDao)applicationContext.getBean("userDao"); userDao.say(); } }
-
得到测试结果:
userDao say that "It is Ok."
Spring的依赖注入
-
依赖注入的概念
- DI:全称是Dependency Injection,中文称之为
依赖注入
。它与控制反转(IoC)
的含义相同,只不过这两个称呼是从两个角度描述的同一个概念。 - IoC:在使用Spring框架之后,对象的实例不再由调用者来创建,而是由Spring容器来创建,Spring容器会负责控制程序之间的关系,而不是由调用者的程序代码直接控制。这样,控制权由应用代码转移到了Spring容器,控制权发生了反转,这就是控制反转。
- DI:从Spring容器的角度来看,Spring容器负责将被依赖对象赋值给调用者的成员变量,这相当于为调用者注入了它依赖的实例,这就是Spring的依赖注入。
- DI:全称是Dependency Injection,中文称之为
-
使用setter方法实现依赖注入
在
vip.ruoli.Spring
包中,创建UserService,在接口中编写一个say()方法。package vip.ruoli.Spring; /** * @author 若离 * @date 2020/9/14 20:39 */ public interface UserService { public void say(); }
-
之后在
vip.ruoli.Spring
包中创建UserService的实现类UserServiceImp,在类中声明userDao属性,并添加属性userDao的setter方法。package vip.ruoli.Spring; /** * @author 若离 * @date 2020/9/14 20:40 */ public class UserServiceImp implements UserService{ private UserDao userDao; public void setUserDao(UserDao userDao){ this.userDao=userDao; } @Override public void say() { this.userDao.say(); System.out.println("userService say that \"It is Ok.\""); } }
-
在Spring的配置文件applicationContext.xml中创建一个id为userService的Bean,该Bean用于实例化UserServiceImp类中的信息,并将userDao的示例注入到userService中。
<?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-4.3.xsd"> <bean id="userDao" class="vip.ruoli.Spring.UserDaoImp" /> <bean id="userService" class="vip.ruoli.Spring.UserServiceImp" > <property name="userDao" ref="userDao"/> </bean> </beans>
-
在
vip.ruoli.Spring
包创建测试类TestService,来对程序进行测试,代码如下:package vip.ruoli.Spring; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; /** * @author 若离 * @date 2020/9/14 20:43 */ public class TestService { public static void main(String[] args) { ApplicationContext applicationContext =new ClassPathXmlApplicationContext("applicationContext.xml"); UserService userService=(UserService)applicationContext.getBean("userService"); userService.say(); } }
-
测试结果如下
userDao say that "It is Ok." userService say that "It is Ok."