Spring是分层的JavaSE/EE full-stack(一站式) 轻量级开源框架。是为了解决企业应用程序开发复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。
Spring 框架由来 :
在2002 年 Rod Johnson 推出 Expert One-to-One J2EE Design and Development
在2004 年 推出 Expert One-to-One J2EE Development without EJB
Spring 出现,解决EJB 存在一些问题 , 因为EJB 比较繁重,复杂, Spring 比较轻便
Spring 好处 :
方便解耦,简化开发
AOP
声明式事务管理
方便程序测试, 整合junit (内嵌优秀测试框架)
Spring 几乎可以整合 业界所有优秀框架 (struts2 、hibernate 、 mybatis)
内置大量工具类,简化应用开发 ,例如:JdbcTemplate 、 javamail、 RMI
Spring 核心:
IOC(Inverse of Control) 控制反转
AOP ( Aspect Oriented Programming) 面向切面编程
IOC 和 AOP:
控制反转的基本概念是:不创建对象,但是描述创建它们的方式。在代码中不直接与对象和服务连接,但在配置文件中描述哪一个组件需要哪一项服务。容器 (在 Spring 框架中是 IOC 容器) 负责将这些联系在一起。
AOP,是一种编程技术,它允许程序员对横切关注点或横切典型的职责分界线的行为(例如日志和事务管理)进行模块化。
IOC和DI
IoC 反转控制的概念,就是将原本在程序中手动创建HelloService对象的控制权,交由Spring框架管理,简单说,就是创建HelloService对象控制权被反转到了Spring框架
对象创建权被反转到了容器
DI:Dependency Injection 依赖注入,在Spring框架负责创建Bean对象时,动态的将依赖对象注入到Bean组件
容器提供对象时,将依赖的对象一起提供给你
spring 入门demo:
spring开发的最少jar包
spring-beans
spring-core
spring-context
spring-expression
Spring开发,必须依赖commons-logging 日志包 (可以独立使用,也可以整合jdk日志或者 log4j 日志 )
整合log4j 复制jar到lib 、在src 建立log4j.properties
代码实现:
UserService接口:
package com.my.service;
public interface UserService {
// 登陆方法
public void login();
// 设置姓名
public void setUsername(String name);
}
UserServiceImpl实现类:
package com.my.service;
public class UserServiceImpl implements UserService{
// username 就是 UserServiceImpl 依赖一个对象
private String username;
public UserServiceImpl() {
System.out.println("user service 被构造...");
}
@Override
public void login() {
System.out.println(username + " 用户登陆");
}
public void setUsername(String username) {
this.username = username;
}
}
配置文件,放置在src下:
log4j.properties
### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
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
### set log levels - for more verbose logging change 'info' to 'debug' ###
log4j.rootLogger=info, stdout
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:p = "http://www.springframework.org/schema/p"
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">
<!-- 1. 快速入门 -->
<!-- 提供对象创建权 -->
<!-- id 属性 bean唯一标识, class 创建对象完成类名 -->
<bean id="userService" class="com.my.service.UserServiceImpl">
<!-- 在创建对象时,将其依赖属性 ,自动注入 -->
<property name="username" value="testSpring"></property>
</bean>
</beans>
测试文件:
package com.my.service;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test2 {
//没有spring容器
@Test
public void demo1() {
UserService service = new UserServiceImpl();
// 设置用户姓名(手动设置依赖)
service.setUsername("test");
service.login();
}
//使用Spring 容器管理UserService 实现对象
@Test
public void demo2(){
// 1、 初始化Spring容器对象
//如果Spring配置文件 在src ---- 使用 ClassPathXmlApplicationContext 读取
//如果Spring配置文件 在WEB-INF ---- 使用 FileSystemXmlApplicationContext 读取
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
// 2、 从容器获得需要Bean <bean id="userService" ..>
// applicationContext对象 类似工厂对象
// 在Ioc 控制对象过程,根据属性依赖关系,完成自动注入
UserService service = (UserService) applicationContext.getBean("userService") ;// 从spring容器得到管理Bean对象
// 3、 调用业务
service.login();
}
//使用BeanFactory 获得容器对象
@Test
public void demo3(){
// 1、 初始化容器
BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
// 2、 获得目标对象
UserService service = (UserService) beanFactory.getBean("userService");
// 3、 调用业务
service.login();
}
}
Spring 容器对象
BeanFactory ,就是Bean管理工厂,是Spring顶级容器接口
ApplicationContext 接口只是BeanFactory 接口的子接口(扩展后)
区别: BeanFactory 延迟加载配置文件中声明Bean对象,当getBean时候,才会创建Bean对象, ApplicationContext 会在加载配置文件时,完成对象创建和依赖注入 ;
ApplicationContext 提供国际化处理、 事件传递、 自动装配 … 更多功能
企业开发时,基本上都是使用ApplicationContext 接口