spring
- spring是分层的JavaSE/EE full-stack 轻量级开源框架 ,是以IOC(inverse of control 控制反转和AOP(aspect oriented Programming 面向切面编程)为内核,使用基本的javabean来完成以前可能只由EJB完成的工作
- 通常使用三层:表示层(controller) ,业务逻辑层(service)持久层(dao),spring对每一层都进行的技术支持。
- 表示层(controller):提供了Struts等框架的整合
- 业务逻辑层(service):可以管理事务,记录日志。
- 持久层:可以整合Hibernate,JdbcTemplate等技术
spring的优点
- 不仅可以用于服务器端开发,也可以应用于任何Java应用的开发,
- 方便继承各种优秀框架
- 支持声明式事务处理
- 支持AOP
- 方便程序测试
- 方便解耦,简化开发,降低JavaEE Api的使用难度
spring的体系结构
-
spring是一个分层的结构,它的一系列功能要素被分成20个模块,分成4部分。
-
Beans:提供了BeanFactory,Spring将管理对象称为Bean
-
Core :提供了Spring框架的基本组成部分,包括Ioc和DI功能
-
Context:建立在Core和Beans模块的基础之上,它是访问定义和配置的任何对象的媒介。
-
SPEL:是运行时查询和操作对象图的强大的表达式语言。
-
JDBC:提供了一个JDBC的抽象层,减少开发过程中对数据库操作的编码
-
ORM:对流行对象关系映射的API,
-
OXM:提供了一个支持对象/XML映射的抽象层实现
-
JMS:java消息传递服务
-
Transactions:支持对实现特殊接口和所有pojo类的编程和声明式的事务管理
-
Servket:也称为Spring-webmvc模块,包含Spring模型-视图-控制器(MVC)和REST Web Services实现的Web程序
-
web:提供基本的web开发集成的特性
-
AOP:面向切面编程实现
-
Aspects:是一个成熟的面向切面编程的框架
spring的基础包
spring的核心容器
BeanFactory
- BeanFactory是一个管理Bean的工程,它主要是负责初始各种Bean,并调用他们的声明周期的方法。
- 实际开发中应用的并不多
BeanFactory beanFactory = new XmlBeanFactory(new FileSystemResource("F:/applicatioinContext.xml"));
ApplicationContext
- 它式BeanFactory的子接口,被称为应用上下文,包含Spring BeanFactory的所有的功能,还添加了其他的功能。
ClassPathXmlApplicationContext
- 通过classPathXmlApplicaitonContext创建,从classpath类路径中寻找XML的配置文件,找到后加载完成ApplicationContext的实例化工作,
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(String configLocation);
- 其中的String configLocaiton 参数指定的是Spring配置文件的名称和位置。
FileSystemXmlApplicaitonContext
- FileSystemXmlApplicationContext会从文件系统(绝对路径)找到xml文件,并装在完成ApplicationContext的实例化工作。
ApplicationContext applicationContext1 = new FileSystemXmlApplicationContext(String configLocation);
Java项目和web项目中不同的装配方式ApplicationContext
- 在java项目中,通常会使用ClassPathXmlApplicationContext容器来实例化ApplicationContext容器,
- 在Web项目中,ApplicaitonContext的实例化会交给Web服务器来完成,通常会使用ContextLoaderListener实现的方式。在web.xml中配置即可。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<context-param>
<param-name>contextConfigLocation</param-name>
<!--Spring将加载spring目录下的applicaitonContext.xml文件-->
<param-value>
classpath:spring/applicaitonContext.xml
</param-value>
</context-param>
<!--指定以ContextLoaderListener方式启动Spring容器-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
获取Bean的方法
- T getBean(Class requiredType): 根据类的实例来获取Bean的实例。
- Object getBean(String name):根据容器bean中的id或name来获取指定的Bean,获取后要进行强制类型的转换。
Spring的入门程序
applicaitonContext.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-4.3.xsd">
</beans>
程序
UserDao
package com.yzb.chapter01;
public interface UserDao {
public void say();
}
UserDaoImpl
package com.yzb.chapter01;
public class UserDaoImpl implements UserDao {
@Override
public void say() {
System.out.println("userdao say hello world");
}
}
Test
package com.yzb.chapter01;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import org.springframework.core.io.FileSystemResource;
public class Test {
public static void main(String[] args) {
//初始化spring容器,加载配置文件
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
//通过容器获取UserDao的实例
UserDao userDao = (UserDao) applicationContext.getBean("userDao");
userDao.say();
}
}
application.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-4.3.xsd">
<!--将指定类配置给Spring,让Spring创建对象的实例-->
<bean id="userDao" class="com.yzb.chapter01.UserDaoImpl"></bean>
</beans>
控制反转的一些讲解
- 在上面的例子中,并没有通过new关键字来创建UserDao接口的实现类对象,而是通过spring容器来获取,这就是控制反转的工作机制。
依赖注入
理解
- 在使用了Spring容器后,对象的实例不再是通过new关键字来创建(被调用者创建),而是通过spring容器统一创建,spring容器负责控制程序之间的关系,不在是调用者的程序代码去控制,控制权通过应用代码转移到了Spring容器中,控制权发生了反转,这就是控制反转。
- 依赖注入:Spring容器将被依赖的对象赋值给调用着的成员变量,这就相当于为调用者注入了它依赖的实例,这就是spring的依赖注入。
依赖注入的两种方法
属性Setter方法注入
- 指Spring容器使用setter方法注入被依赖的实例
- 通过调用无参构造方法或者无参静态工厂方法实例化bean后,调用bean的setter方法,即可实现setter方法的依赖注入
UserService
package com.yzb.chapter01;
public interface UserService {
public void say();
}
UserServiceImpl
package com.yzb.chapter01;
public class UserServiceImpl implements UserService {
//声明UserDao的属性
private UserDao userDao;
//添加UserDao属性setter的方法,用于实现依赖注入
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void say() {
this.userDao.say();
System.out.println("UserService say hello world");
}
}
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-4.3.xsd">
<!--将指定类配置给Spring,让Spring创建对象的实例-->
<bean id="userDao" class="com.yzb.chapter01.UserDaoImpl"></bean>
<!--添加一个id为userService的实例-->
<bean id="userService" class="com.yzb.chapter01.UserServiceImpl">
<!--将id为userDao的实例注入到userService实例中-->
<!--property用于调用Bean实例中setUserDao的方法完成属性的赋值,并实现依赖注入,其中name是Bean实例相应的属性名,而ref属性用于指定属性值-->
<property name="userDao" ref="userDao"/>
</bean>
</beans>
Test
package com.yzb.chapter01;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import org.springframework.core.io.FileSystemResource;
public class Test {
public static void main(String[] args) {
//初始化spring容器,加载配置文件
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
//通过容器获取UserDao的实例
UserDao userDao = (UserDao) applicationContext.getBean("userDao");
userDao.say();
UserService userService = (UserService) applicationContext.getBean("userService");
userService.say();
}
}
构造方法注入
- 指Spring容器使用构造方法来注入被依赖的实例,基于构造方法的依赖注入通过调用带参数的构造方法来实现,每个参数代表一个依赖。