spring_day01
1.Spring介绍
1.spring概述:
spring是基于JavaSE/JavaEE企业开发的一站式(全栈式)的轻量级开源框架(Framework)
2.spring起源
Rod Johnson(Spring 之父)
2.耦合性
1.耦合性的含义:
程序间的依赖关系
2.解耦:
降低(削减)程序间的耦合性。程序的执行要求低耦合,高内聚。就是同一个模块下各元素间要高度紧密,但是模块间相互依赖关系不那么紧密。
3.解耦的原因:
提高程序的灵活性和可扩展性
4.解耦的方式:
加载配置文件,获取要创建对象的全限定类名,通过反射的方式创建对象,避免new关键字的使用
Object obj = Class.forName("classPath").newInstance();
3.Spring经典面试题
spring的三大经典思想:IOC DI AOP
IOC: Inversion Of Control (控制反转)
IOC的本质:创建对象交给spring容器来管理,而不是使用new关键字
IOC的作用:降低程序间的耦合性(削减依赖关系)
IOC的实现原理:工厂模式(BeanFactory)+反射+xml配置文件
DI: Dependency Injection (依赖注入)
DI的本质:给某个对象设置值
DI的作用:对象之间有依赖关系,不需要我们手动去设置值,spring框架帮我们解决
AOP: Aspect Oriented Programming(面向切面编程)
AOP作用:将重复的代码抽取出来,利用代理模式,在不修改源码的基础上,对已有的方法进行增强
AOP原理:代理模式
4.String家族
String StringBuffer StringBuilder
String : 字符串常量
String str1 = "aa"; str1 += "bb" ;本质上JVM重新开辟了一个新的内存空间给新的str1,然后垃圾回收机制回收掉原来的str1 = "aa";
StringBuffer : extends AbstractStringBuilder
跟StringBuilder差不多,不过它是线程安全的,所有的方法都使用了synchronized
StringBuilder : 字符串构造者
5.基于xml的spring IOC
1.让spring管理对象,在bean.xml中配置中配置bean标签
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 = " accountService" class = " com.baidu.service.impl.AccountServiceImpl" > </ bean>
< bean id = " accountDao" class = " com.baidu.dao.impl.AccountDaoImpl" > </ bean>
</ beans>
2.BeanFactory和ApplicationContext的区别
BeanFactory是spring中的顶层接口,ApplicationContext的BeanFactory的子接口,在BeanFactory这颗树上的都叫Bean工厂,也叫spring容器。
ApplicationContext是立即加载,只要一读取配置文件,默认情况下就会立刻创建对象,推荐使用。
BeanFactory是延迟加载,当调用getBean()方法,根据id获取对象时才会创建对象。
3.ApplicationContext接口的实现类对象:
1.基于xml配置的实现类
ApplicationContext ac =
new ClassPathXmlApplicationContext("bean.xml"); //classPath,相对resources路径,推荐使用
new FileSystemXmlApplicationContext(String absolutePath); //bean.xml的绝对路径,从磁盘开始
UserServiceImpl userService = ac.getBean("bean容器中的ID");
2.基于注解配置的实现类
new AnnotationConfigApplicationContext();
4.bean标签的配置:
< bean id = " accountService" class = " com.baidu.service.impl.AccountServiceImpl"
scope = " singleton" init-method = " init" destroy-method = " destroy" >
</ bean>
id: 给对象在Bean容器中提供唯一标识,用于创建对象,供applicationContext.getBean(id)引用;
class: 指定需要创建对象的全限定类名,用于反射创建对象,Class.forName("classPath").newInstance();
scope: 指定对象的作用范围
singleton -->创建单例对象,默认值,init/destroy方法只会执行一次
prototype -->创建多例对象,每创建一次对象,调用一次init方法,destroy方法不归spring管辖
request -->在web项目中,创建一个Bean对象,并存入request域中
session -->在web项目中,创建一个bean对象,并存入session域中
global-session -->在web项目中,应用在集群环境中
init-method: 指定类中初始化方法的名称
destroy-method: 指定类中销毁方法的名称
6.bean 的作用范围和生命周期
scope="singleton" : 容器在,bean对象在。容器亡,bean对象亡
一个应用只有一个bean对象的实例,它的作用范围是整个应用
bean的出生:当程序加载完配置文件,创建容器时,立即创建bean对象,即:
ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
bean的存活时间:只要容器存在,bean对象就存在
bean的消亡:当应用结束,容器被销毁时,bean对象就消失了
scope="prototype" :
每获取一次bean对象,就会创建一个新的bean对象实例
bean的出生:当每调用一次getBean()方法时,就创建一个新的bean对象,即:
Object obj = as.getBean(id);
bean的死亡:当对象长时间不使用时,被java的垃圾回收器回收
注意:
1.要想执行destroy方法的效果,需要手动关闭容器对象,否则mian方法结束,destroy方法还没开始执行,整个方法就直接结束了。classPathXmlApplicationContext.close();
2.只有指定为scope="singleton"才能调用bean对象中destroy方法的执行;如果指定为scope="prototype"因为对象是由java的垃圾回收器回收的,此时main方法早就结束了,对象早已不再使用,所以也无法再执行destroy法,spring不负责多例对象的销毁
7.实例化Bean的三种方式
第一种方式:使用默认无参构造函数
< bean id = " accountService" class = " com.baidu.service.impl.AccountServiceImpl" >
在默认情况下:会根据默认无参构造函数来创建类对象。如果 bean 中没有默认无参构造函数,将会创建失败。
第二种方式: Spring 管理静态工厂-使用静态工厂的方法创建对象
public class StaticFactory{
public static AccountServiceImpl createAccountService(){
return new AccountServiceImpl();
}
}
< bean id = " accountService" class = " com.baidu.factory.StaticFactory"
factory-method = " createAccountService" > </ bean>
class : 指定静态工厂的全限定类名
factory-method : 指定生产对象的静态方法
第三种方式: spring 管理实例工厂-使用实例化工厂的方法创建对象
public class StaticFactory{
public AccountServiceImpl createAccountService(){
return new AccountServiceImpl();
}
}
< bean id = " instanceFactory" class = " com.baidu.factory.InstanceFactory" > </ bean>
< bean id = " accountService" factory-bean = " instanceFactory" factory-method = " createAccountService" >
factory > id : 唯一标识,供实例对象factory-bean引用
class : 指定实例工厂的全限定类名
factory-bean : 用于指定实例工厂bean对象的id
factory-method : 指定实例工厂中创建对象的方法