Spring是一个开放源代码的设计层面的框架,他解决的是业务逻辑和其它各层的松耦合问题,它将面向接口的编程思想贯穿整个应用系统。它是一个Java EE轻量级开发框架。.
一.Spring中的几个核心要素:
1.IoC
-控制反转(Inversion of Control,缩写为IoC),它是一个重要的面向对象编程的法则,用来消弱计算机中的耦合问题。它是轻量级框架-Spring的核心内容之一。
-对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用传递给它。
-使用了Spring之后,对象的创建以及依赖关系由Spring完成创建和注入。
-控制反转即反转对象的创建方式,程序员的创建交给了Spring来完成。
2..DI
- 依赖注入(Dependency Injection,简称DI)
- 实现IoC的思想就需要DI的支持
- 注入的实现方式
- setter方法注入
- 构造方法注入
- 属性值直接注入(即在定义属性的时候就赋初值)
3.BeanFactory
(它是一个接口),该工厂采用了延迟加载的思想来创建对象即每次获取对象时才创建一个对象。
4 ApplicationContext容器(IoC容器)
作用:Spring在启动时会自动创建配置的相关对象,也就是解析完XML文件后就会创建对象。
两大实现类:
1) ClassPathXmlApplicationContext:从类路径下查找加载配置文件(只能从类路径下查找加载配置文件)
ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
2) FileSystemXmlApplicationContext:从硬盘绝对路径下查找加载配置文件
FileSystemXmlApplicationContext context=new FileSystem
XmlApplicationContext("D:\\....");
二.遇到过的问题及解决思路
1.对象的生命周期的经历的过程,在什么时候创建什么时候初始化,执行和销毁等很模糊
解答:初始化:在Spring创建这个对象之后调用。
销毁:Spring容器在关闭的时候并销毁容器中的所有对象。
spring容器所管理的对象的生命周期:
(a)在单例情况下:
1、当spring容器初始化的时候创建对象
2、spring容器调用初始化方法
3、客户端调用该对象的某些方法
4、关闭容器的时候,由容器执行销毁方法
(b)在多例的情况下:
1、当客户从容器获取对象时,由spring容器创建该对象
2、spring容器调用初始化方法
3、客户端调用该对象的某些方法
4、关闭容器的时候,不会调用销毁方法。(当对象长时间不用并且也没有其他对象引用时,由垃圾回收机制销毁对象)。
2.XML文件配置和注解配置的选择问题
1)两种方式的优缺点:
a)XML文件的配置不用修改Java源码,而注解配置是需要Java源码的。对于Web工程而言,修改源码意味着重新启动Tomcat服务器。
b) XML配置相对比较繁琐,实现一个功能可能需要配置好几行代码。例如配置Spring的事务,XML代码可能要20行左右,而注解使用一个可能就够了。
c)XML配置的方式在大型项目中,维护起来比较麻烦。注解的方式在类中维护,一目了然;而XML配置可能需要在多处进行修改。
解决:2)两种方式的选择依据:
如果配置需要经常修改,而且配置的内容越来越多,建议选择注解的方式;
如果配置的东西一劳永逸,建议选择XML配置方式。
3.动态代理生成代理对象的参数问题理解不清
解决:
//生成代理对象
public StudentService getStudentService()
{
//生成代理对象
//此方法的第一个参数:生成的代理类必须与被代理类在同一个类加载器中,所以此处调用了被代理对象的类加载器
//第二个参数:被代理对象所实现接口的字节码数组,被代理对象可能会实现多个接口,本例中的被代理对象只实现了一个接口
//第三个参数:将实现InvocationHandler接口的类的对象传递进去。
//这个方法会把代理的全部接口用一个由代码动态生成的类实现,将来调用接口中的任何一个方法都会去调用InvocationHandler.invoke()方法。
StudentService stuService=(StudentService)Proxy.newProxyInstance(StudentServiceFactory.class.getClassLoader(), StudentServiceImp.class.getInterfaces(), this);
return stuService;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//调用业务方法之前需要执行的方法
startTransaction();
Object obj=method.invoke(stuService, args);
//调用业务方法之后要执行的方法
stopTransaction();
return obj;
}
//正交的业务逻辑
private void startTransaction()
{
System.out.println("------开启事务");
}
//正交的业务逻辑
private void stopTransaction()
{
System.out.println("------关闭事务");
}
}