Spring
Spring是于2003 年兴起的一个开源,轻量级(不需要依赖其他配置直接使用),一站式的Java开发框架,由Rod Johnson创建。
一站式:spring在javaee三层结构中,每一层都提供不同的解决技术
- web层:SpringMVC
- service层:Spring的IOC
- dao层:Spring的jdbcTemplate
三大特点
容器:Spring框架是一个容器,能够管理项目中的所有对象。
IOC(控制反转):Spring将创建对象的方式反转了,从程序员自己创建反转给了程序。
AOP(面向切面):面向切面编程,简而言之,就是将纵向重复的代码横向抽取出来。Spring框架应用了面向切面的思想,主要体现在为容器中管理的对象生成动态代理对象。
IOC
IOC:Inverse of Control 控制反转,将对象的创建权交给了Spring。
把对象的创建不是通过new方式实现,而是交给spring配置创建类对象。
底层原理使用技术
- xml配置文件
- dom4j解决xml
- 工厂设计模式
- 反射
画图分析ioc实现原理
创建User类,当servlet调用User类中add方法时,需要在servlet中new一个User类,此时User类和servlet类耦合度太高,如果User类改类名或add方法名改变时,servlet类也得改。
针对上面情况,我们优化代码,将add方法放在UserService类中,新建一个工厂类专门创建UserService类对象,此时servlet类只需要调用工厂类就可以创建UserService对象,但是这样操作使得servlet类和工厂类耦合度变高,所以,我们使用spring框架创建UserService对象,降低程序耦合度。
我们看看spring框架是如何创建一个UserService对象,
第一步:创建xml文件对UserService进行配置;
第二步:spring框架使用dom4j对xml文件进行解析,根据id值,得到UserService的class属性;
第三步:使用反射通过class属性创建UserService对象,并返回。
这三步都是在spring内部进行,无需我们操作,这就是ioc控制反转。
IOC入门案例
第一步:导入jar包
Jar特点:
.jar——jar包
javadoc.jar——文档包
sources.jar——源码包
做Spring最基本功能时候,导入四个核心的jar包就可以了
导入支持日志输出的jar包
第二步:创建类,在类里面创建方法
public class User {
public void add() {
System.out.println("输出add方法");
}
public static void main(String[] args) {
// 原始做法
User user = new User();
user.add();
}
}
第三步: 创建Spring配置文件,配置创建类
Spring核心配置文件名称和位置不是固定的,建议放到src下面,官方建议applicationContext.xml
引入schema约束,并配置对象创建
<?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">
<bean id="user" class="com.feicui.pojo.User"></bean>
</beans>
引入log4j.properties配置文件
### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.err
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
### direct messages to file mylog.log ###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=c://mylog.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
log4j.rootLogger=info, stdout
第四步:写代码测试对象创建
public class T1 {
@Test
public void T1() {
// 加载Spring配置文件
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
// 得到配置创建的对象
User user = (User) context.getBean("user");
System.out.println(user);
user.add();
}
}
配置文件没有约束问题
spring引入schema约束,把约束文件引入到eclipse中
复制约束路径:http://www.springframework.org/schema/beans/spring-beans.xsd
Window-->最后一行Preferences-->搜XML Catalog-->Add
约束路径复制到Key
Location引入本地文件
Key type改为Schema location
Spring的分配置文件的开发
一种:创建工厂的时候加载多个配置文件
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml","applicationContext2.xml");
二种:在一个配置文件中包含另一个配置文件
<import resource="applicationContext2.xml"></import>
Spring中的工厂
ApplicationContext
ApplicatioContext接口有两个实现类
- ClassPathXmlApplicationContext:加载类路径下spring的配置文件
- FileSystemXmlApplicationContext:加载本地磁盘下spring的配置文件
BeanFactory
BeanFactory和ApplicationContext的区别
BeanFactory:是在getBean的时候才会生成类的实例
ApplicationContext:在加载applicationContext.xml时候就会创建
结论:web开发中使用applicationContext,在资源匮乏的环境可以使用BeanFactory。