1、什么是框架
- 维基百科:软件框架,通常指的是为了实现某个业界标准或完成特定基本任务的软件组件规范,也指为了实现某个软件组件规范时,提供规范所要求之基础功能的软件产品
- 框架就是制定一套规范或者规则(思想),大家(程序员)在该规范或者规则(思想)下工作。或者就是说使用别人搭好的舞台,你来做表演。
- 框架特点
(1)半成品
(2)封装了特定的处理流程和控制逻辑
(3)成熟的,不断升级改进的软件 - 框架与类库的区别
(1)框架一般是封装了逻辑,高内聚的,类库则是松散的工具组合
(2)框架专注于某一领域,类库则是更通用的
为什么使用框架 - 软件系统日益复杂
- 重用度高,开发效率和质量提高
- 软件设计人员要专注于对领域的了解,使需求分析更充分
- 易于上手,快速解决问题
2、Spring简介
- Spring是一个开源框架,为了解决企业应用开发的复杂性而创建的,但现在已经不止应用于企业应用
- 是一个轻量级的控制反转(IOC)和面向切面(AOP)的容器框架
(1)从大小与开销两方面而言,spring都是轻量级的
(2)通过控制反转(IOC)的技术达到松耦合的目的
(3)提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统服务进行内聚性的开发
(4 )包含并管理应用对象的配置和生命周期,在这个意义上是一种容器
(5)将简单的组件配置,组合成为复杂的应用,这个意义上是框架
为什么是Spring - 在spring上开发应用简单
- 在spring上开发应用方便
- 在spring上开发应用快捷
- Spring带来了复杂JavaEE开发的春天
Spring组件:
Spring作用: - 容器
- 提供了多种技术支持
JMS、MQ支持、UnitTest、。。。 - AOP(事物管理、日志等)
- 提供了众多方便应用的辅助类(JDBC Template等)
- 对主流应用框架(Hibernate等)提供了良好的支持
适用范围 - 构建企业应用(SpringMVC+Spring+Hibernate/ibatis)
- 单独使用Bean容器(Bean管理)
- 单独使用AOP进行切面处理
- 其它的Spring功能,如: 对消息的支持等
- 在互联网中的应用。。。
3、IOC(配置、注解)
- 接口及面向接口编程
//接口
(1)用于沟通的中介勿的抽象化
(2)实体把自己提供给对外界的一种抽象化说明,用以由内部操作分离出外部沟通方法,是其能被修改内部而不影响外界其他实体与其交互的方式
(3)对应java接口即声明,声明了哪些方法是对外公开提供的
(4)在java8中,接口可以拥有方法体
//面向接口编程
(1)结构设计中,分清层次及调用关系,每层只向外(上层)提供一组功能接口,各层间仅依赖接口而非实现类
(2)接口实现的变动不影响各层间的调用,这一点在公共服务中尤为重要
(3)“面向接口编程”中的“接口”是用于隐藏具体实现和实现多态性的组件
(4)例子:
/接口:OneInterface.java
public interface OneInterface{
String hello(String word);
}
/实现类:OneInterfaceImpl.java
public class OneInterfaceImpl implements OneInterface {
@Overrride
public String hello(String word) {
return "Word form interface \"OneInterface\":"+word);
}
}
/测试类:Main.java
public class Main{
public static void main(String[] args) {
OneInterface oif = new OneInterfaceImpl();
System.out.println(oif.hello("word."));
}
}
- 什么是IOC
(1)IOC:控制反转,控制权的转移,应用程序本身不负责依赖对象的创建和维护,而是由外部容器负责创建和维护
(2)DI(依赖注入)是其一种实现方式
(3)目的:创建对象并且组装对象之间的关系
(4)扩展理解
4、 Spring的Bean配置
(1)刚才的接口在Spring中的配置方式
<?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="oneInterface" class="com.imooc.ioc.interfaces.OneInterfaceImpl"></bean>
</beans>
(2)测试用例//TestOneInterface.java
@RunWith(BlockJUnit4ClassRunner.class)
public class TestOneInterface extends UnitTestBase {
//子类调用构造器
public TestOneInterface() {
//传入xml文件的位置
super("classpath*:spring-ioc.xml");
}
@Test
public void testSay() {
//.getBean("oneInterface");
//获取<bean id..>返回的是OneInterfaceImp对象
OneInterface oneInterface = super.getBean("oneInterface");
oneInterface.say("This is a test.");
}
}
(3)拓展//单元测试
//下载junit-*.jar并引入工程
//创建UnitTestBase类,完成对spring配置文件的加载、销毁
//所有的单元测试类都继承自UniTestBase,通过他的getBean方法获取想要的对象
//子类(具体执行单元测试的类)加注解:
@RunWith(BlockJUnit4ClassRunner.class)
//单元测试方法加注解:@Test
//右键选择要执行的单元测试方法执行或者执行一个类的全部单元测试方法
//UnitTestBase.java
public class UnitTestBase {
private ClassPathXmlApplicationContext context;
private String springXmlpath;
public UnitTestBase() {}
public UnitTestBase(String springXmlpath) {
this.springXmlpath = springXmlpath;
}
@Before
public void before() {
if (StringUtils.isEmpty(springXmlpath)) {
springXmlpath = "classpath*:spring-*.xml";
}
try {
context = new ClassPathXmlApplicationContext(springXmlpath.split("[,\\s]+"));
context.start();
} catch (BeansException e) {
e.printStackTrace();
}
}
@After
public void after() {
context.destroy();
}
@SuppressWarnings("unchecked")
protected <T extends Object> T getBean(String beanId) {
try {
return (T)context.getBean(beanId);
} catch (BeansException e) {
e.printStackTrace();
return null;
}
}
protected <T extends Object> T getBean(Class<T> clazz) {
try {
return context.getBean(clazz);
} catch (BeansException e) {
e.printStackTrace();
return null;
}
}
}
5、 Bean的初始化
- 基础:两个包
//org.springframework.beans
//org.springframework.context
//BeanFactory提供配置结构和基本功能,加载并初始化Bean
//ApplicationContext保存了Bean对象并在Spring中被广泛使用 - 方式,ApplicationContext
//本地文件
FileSystemXmlApplicationContext context =
new FileSystemXmlApplicationContext(“F:/workspace/appcontext.xml”);
//Classpath
ClassPathXmlApplicationContext context =
new ClassPathApplicationContext(“classpath:spring-context.xml”);
//Web应用中依赖servlet或Listener
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>context</servlet-name>
<servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
6、 Spring的常用注入方式
(1)Spring注入是指在启动Spring容器加载bean配置的时候,完成变量的赋值行为
(2) 常用的注入方式
//设值注入:spring-injection.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.xsd" >
<bean id="injectionService" class="com.imooc.ioc.injection.service.InjectionServiceImpl">
<property name="injectionDAO" ref="injectionDAO"></property>
</bean>
<!-- <bean id="injectionService" class="com.imooc.ioc.injection.service.InjectionServiceImpl"> -->
<!-- <constructor-arg name="injectionDAO" ref="injectionDAO"></constructor-arg> -->
<!-- </bean> -->
<bean id="injectionDAO" class="com.imooc.ioc.injection.dao.InjectionDAOImpl"></bean>
</beans>
//构造注入:spring-injection.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.xsd" >
<!-- <bean id="injectionService" class="com.imooc.ioc.injection.service.InjectionServiceImpl"> -->
<!-- <property name="injectionDAO" ref="injectionDAO"></property> -->
<!-- </bean> -->
<bean id="injectionService" class="com.imooc.ioc.injection.service.InjectionServiceImpl">
<constructor-arg name="injectionDAO" ref="injectionDAO"></constructor-arg>
</bean>
<bean id="injectionDAO" class="com.imooc.ioc.injection.dao.InjectionDAOImpl"></bean>
</beans>
//实例:
service实现类:InjectionServiceImpl.java
public class InjectionServiceImpl implements InjectionService {
private InjectionDAO injectionDAO;
//构造器注入
public InjectionServiceImpl(InjectionDAO injectionDAO) {
this.injectionDAO = injectionDAO;
}
//设值注入
public void setInjectionDAO(InjectionDAO injectionDAO) {
this.injectionDAO = injectionDAO;
}
public void save(String arg) {
//模拟业务操作
System.out.println("Service接收参数:" + arg);
arg = arg + ":" + this.hashCode();
injectionDAO.save(arg);
}
}
测试类:TestInjection.java
@RunWith(BlockJUnit4ClassRunner.class)
public class TestInjection extends UnitTestBase {
public TestInjection() {
super("classpath:spring-injection.xml");
}
@Test
public void testSetter() {
InjectionService service = super.getBean("injectionService");
service.save("这是要保存的数据");
}
@Test
public void testCons() {
InjectionService service = super.getBean("injectionService");
service.save("这是要保存的数据");
}
}
专题二:Bean(配置、注解)
5、AOP(配置、注解、AspectJ、API )
如何学习Spring
掌握用法
深入理解
不断实战
反复总结
再次深入理解实践
学习资源
http://spring.io/
http://projects.spring.io/spring-framework