spring概述
一、spring框架的优点:
- 非侵入式设计:可以使应用程序代码对框架的依赖最小化(允许在应用系统中自由选择和组装Spring框架的各个功能模块,并且不强制要求应用系统的类必须从Spring框架的系统API的某个类来继承或者实现某个接口。)
- 方便解耦、简华开发:spring就是一个大工厂,可以将对象的创建和依赖关系的维护工作都交给Spring容器管理。大大降低了组件之间的耦合性。
- 支持AOP:允许将一些通用任务,如安全、事务、日志等进行集中式处理,从而提高了程序的复用性。
- 支持声明式事务处理:通过配置就可以完成事务的管理,无需手动编程
- 方便程序的测试:Spring提供了Junit4的支持,可以通过注解方式直接测试Spring程序。
- 方便集成各种优秀框架
- 降低了JavaEE API使用难度:对一些JavaEE中难用的API(如jdbc,javaMail)进行封装。
Spring体系结构
一:主要的模块介绍:
1、Core Container(核心容器):是其他模块建立的基础,主要有beans模块。Core模块,Context模块,Context-support模块和SpEl模块组成。
- Beans:提供BeanFactory,工厂模式的经典实现,Spring将管理对象称为Bean。
- Core核心模块:提供Spring框架的基本组成部分。包括IoC和DI功能。
- Context-support;提供对第三方嵌入Spring应用的集成支持。
- SpEL:表达式语言
2、Data Access/Integration(数据访问/集成)
- JDBC:提供了jdbc的抽象层。
- orm模块:对流行的对象关系映射API,包括JPA/JDO和hibernate提供集成层支持
- oxm模块:提供支持对象/xml映射的抽象层实现。
- JMS:java消息传递服务。
- Transactions事务模块:对实现特殊接口以及所有POJO类编程和声明式的事务管理。
3、web
- WebSocket:提供WebSocket和sockJS的实现。
- Servlet:包含Spring的模型—视图—控制器和REST Web services实现的Web应用程序。
- web:提供基本的web应用开发集成特性,例如:多文件上传功能等。
- protlet
4、其他模块
- AOP模块:提供面向切面编程实现,允许定义方法拦截器和切入点,将代码按照功能进行分类,降低耦合性。
- Aspects模块:提供与AspectJ的集成功能,AspectJ是一个功能强大且面向切面编程(AOP)框架。
- Instrumentation模块:提供了类工具的支持和类加载器的实现,可以在特定服务器中使用。
- messaging模块:消息传递体系结构和协议的支持。
- Test:对单元测试和集成测试的支持。
Spring的核心容器
一、BeanFactory
由org.springframework.beans.factory.BeanFactory接口定义,基础类型的IOC容器。是一个管理Bean的工厂,主要负责初始化各种Bean,并调用他们的生命周期方法。
二、ApplicationContext
是BeanFactory的子接口,也成为应用上下文,是另一种常用的Spring核心容器。创建ApplicationContext接口实例的具体方法:
1、通过ClassPathXmlApplicationContext创建
ClassPathXmlApplicationContext从类路径classPath中寻找指定的xml配置文件,找到并装载完成ApplicationContext的实例化工作
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(String configLocation)
configLocation用于指定spring配置文件的名称和位置。
2、通过FileSystemXmlApplicationContext创建
FileSystemXmlApplicationContext会从指定的文件系统路径(绝对路径)中寻找指定的XML配置文件,找到并装载完成ApplicationContext的实例化工作。用法如下:
ApplicationContext applicationContext = new FileSystemXmlApplicationContext(String configLocation)
读取配置文件时,通过参数指定配置文件的位置。一定是绝对路径。
使用Spring框架时,可以通过实例化其中任何一个雷来创建ApplicationContext容器。在Web中,ApplicationContext容器的实例化工作会交由Web服务器来完成。通常基于ContextLoaderListener实现的方式。只需在web.xml添加如下代码。
<!--指定Spring配置文件的位置,多个配置文件时,以逗号分隔- >
<context-param>
<param-name>contextConfigLocation</param-name>
<!- Spring 将加载spring目录下的applicationContext,xm1文件->
<param-value>
classpath:spring/applicationContext. xml</param-value></ context-param>
<!-- 指定以ContextLoaderListener方式启动Spring容器-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener>
在创建完Spring容器后,可以获取Spring中的Bean。有两种方法
- Object getBean(String name):根据容器中Bean的id或者name来获取指定的Bean,获取后需要进行强制转换。
- <T>T getBean(Class<T> requiredType):根据类的类型来获取Bean的实例。此方法为泛型方法,因此不需要强制转换。
***BeanFactory和ApplicationContext都是通过XML配置文件加载Bean的,二者区别:如果Bean的某一个属性没有注入,使用BeanFactory加载后,在第一次调用getBean()方法时会抛出异常,而ApplicationContext则在初始化时自检,这样有利于检查所依赖属性是否注入。
Spring入门程序
一、IOC底层原理
- xml配置文件
- dom4j解决xml
- 工厂设计模式
- 反射
如图:
来源:传智播客
(1)创建工程后,在ico包中创建接口UserDao 并定义各一个say()方法。
public interface UserDao {
public void say();
}
(2)创建接口实现类UserDaoImpl 实现接口中say()方法
public class UserDaoImpl implements UserDao{
@Override
public void say() {
// TODO Auto-generated method stub
System.out.println("userDao say hello world!");
}
}
(3)在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">
<!-- 将制定类配置给spring ,让spring创建其对象的实例 -->
<bean id = "userDao" class = "com.itheima.ioc.UserDaoImpl"/>
</bean>
</beans>
其中class属性用于指定需要实例化的Bean的类。
(4)创建测试类 TestIoc main方法中需要初始化Spring容器,并加载配置文件,然后通过Spring容器获取userDao实例。最后调用say方法。
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestIoc {
public static void main(String[] args) {
// TODO Auto-generated method stub
//初始化spring容器,加载配置文件
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
//通过容器获取userDao实例
UserDao userDao = (UserDao)applicationContext.getBean("userDao");
//调用实例中的方法
userDao.say();
}
}
该程序并没有通过new关键字创建UserDao接口的实现类对象,而是通过Spring容器来获取实现类对象,这就是SpringIOC工作机制。
依赖注入
依赖注入(Dependency Injection 简称DI)与控制反转(IoC)的含义相同,只不过两个称呼从两个角度来描述同一个概念。
当某个java对象(调用者)需要调用另一个java对象(被调用者,即被依赖对象)时,传统模式会采用“new一个被调用者”。但是会导致调用者和被调用者之间耦合性增加,不利于升级和维护。
在Spring 中对象的实例由spring容器来创建,Spring容器会负责控制程序之间的关系,而不是调用者的程序直接控制。控制权由应用代码转移到spring容器,控制权发展反转。
从spring容器看:spring容器负责将被依赖对象赋值给调用者的成员变量,相当于为调用者注入了它依赖的实例。即为依赖注入
一、依赖注入的实现方式
依赖注入的作用在spring框架创建对象时,动态的将其所依赖的对象注入Bean组件中,通常有两种。一种是使用setter方法注入,另一种使用构造方法注入。
- 属性setter方法注入:通过调用无参构造函数或无参静态工厂方法实例化Bean后,调用该Bean的setter方法,即可实现依赖注入
- 构造方法注入:通过调用带参数的构造方法来实现,每一个参数代表着一个依赖。
1、以setter方式注入
(1)userservice类:
public interface UserService {
public void say();
}
(2)userserviceImpl:
public class UserServiceImpl implements UserService {
//声明UserDao属性
private UserDao userDao;
//添加UserDao属性的setter方法,用于事项依赖注入
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
//实现接口中的方法
public void say() {
//调用userDao中的say方法,并输出语句
System.out.println("userDao.say也运行了");
this.userDao.say();
System.out.println("userSevice say hello!");
}
}
(3)在配置文件中创建一个id为userService的Bean,该Bean用于实例化UserServiceImpl类的信息,并将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">
<!-- 将制定类配置给spring ,让spring创建其对象的实例 -->
<bean id = "userDao" class = "com.itheima.ioc.UserDaoImpl"/>
<!-- 添加一个userSerivce的实例 -->
<bean id = "userService" class = "com.itheima.ioc.UserServiceImpl">
<!-- 将id为userDao的Bean实例注入到userService实例中 -->
<property name = "userDao" ref = "userDao"/>
</bean>
</beans>
上述代码中<property>是<bean>元素的子元素,用于调用Bean实例中的setUserDao方法完成属性赋值。完成依赖注入,name表示bean实例中的相应属性名,ref表示用于指定其属性。
(4)测试:
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestDI {
public static void main(String[] args) {
// TODO Auto-generated method stub
//初始化spring容器,加载配置文件
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
//通过容器获取userService实例
UserService service = (UserService)applicationContext.getBean("userService");
service.say();
}
}
Ioc和DI的区别:
- Ioc:控制反转,把对象创建交给spring进行配置。
- DI:依赖注入,向类里面的属性中设置值。
- 关系:依赖注入不能单独存在,需要在ioc基础上完成操作。
ps:复习spring框架时所记录的笔记。转载请注明。