spring框架相关:
1.为什么使用springboot?
- 使用springboot,带有spring框架的优秀特性,IOC和aop。
- 大量简化了spring的配置过程,无需使用xml配置开发过程,Bean的注入,使用注解加上一个application.properties就可以完成大部分的配置工作。
- 整合第三方框架的时候 也不需要过多的配置,只需要在maven中导入相关的jar包就可以了。
- springboot内置tomcat 一键启动,无需整合服务器。当然也可以使用外置的tomcat.(打成war包,移除内部tomcat依赖)
- 运行方式是jar包的方式,在linux上 java -jar xxx 就可以运行。
- 对于微服务,小型项目很实用,便于开发。
2.Spring框架的特点
- IOC和AOP
IOC(控制反转)
将创建对象的过程由程序代码控制交给了spring容器,由spring来控制对象的生命周期。
目的:
1.解耦 降低了类之间的耦合,利于维护。(不是在运行的时候在对象中所求另外一个依靠的对象,而是通过xml配置或者注解,在运行期间直接将依赖的对象创建好 注入进来)所以又可以叫依赖注入。
2.灵活性更好。
IOC的实现原理:工厂模式和java的反射机制。
不加反射的工厂模式:
interface fruit{
public abstract void eat();
}
class Apple implements fruit{
public void eat(){
System.out.println("Apple");
}
}
class Orange implements fruit{
public void eat(){
System.out.println("Orange");
}
}
//构造工厂类
//也就是说以后如果我们在添加其他的实例的时候只需要修改工厂类就行了
class Factory{
public static fruit getInstance(String fruitName){
fruit f=null;
if("Apple".equals(fruitName)){
f=new Apple();
}
if("Orange".equals(fruitName)){
f=new Orange();
}
return f;
}
}
class hello{
public static void main(String[] a){
fruit f=Factory.getInstance("Orange");
f.eat();
}
}
此时,我们可以通过工厂模式传入一个类名参数得到对应的对象,但是如果还想要得到没有的对象,就必须修改工厂模式。
带有反射的工厂模式:
class Factory{
public static fruit getInstance(String ClassName){
fruit f=null;
try{
f=(fruit)Class.forName(ClassName).newInstance();
}catch (Exception e) {
e.printStackTrace();
}
return f;
}
}
加入了反射的工厂模式,每次只需要增加子类而不需要修改工厂模式。
现在就算我们添加任意多个子类的时候,工厂类都不需要修改。使用反射机制实现的工厂模式可以通过反射取得接口的实例,但是需要传入完整的包和类名。而且用户也无法知道一个接口有多少个可以使用的子类,所以我们通过属性文件的形式配置所需要的子类。
IOC中最基本的技术就是“反射(Reflection)”编程,通俗来讲就是根据给出的类名(字符串方式)来动态地生成对象,这种编程方式可以让对象在生成时才被决定到底是哪一种对象。只是在Spring中要生产的对象都在配置文件中给出定义,目的就是提高灵活性和可维护性。
IOC的注意点:
1.使用IOC 也会使得系统变得复杂
2.IOC生成对象的方式是反射,运行效率有一定的损耗。
3.大量的配置工作。
AOP面向切面编程
是对oop面向对象编程的补充,oop引入的是对曾层次结构,程序的运行可以看成一个柱体自上而下的过程,对象就是这个柱体,但是一些公共的行为,业务行为之外的行为,例如打印日志,分布在代码中会导致代码的冗余度和复杂度变高。
AOP技术就是将这些非业务代码封装到一个可重用的模块,便于操作和维护。
在某一个行为的前后(切入点),打入这些模块就可以完成这些操作。
AOP 的实现:依靠java 的动态代理 和cglib的动态代理。
区别:jdk动态代理必须要实现一个接口的类生成代理,CGlib利用的是继承的方式生成代理类。
实现原理:通过对代理类中方法的增强,加上反射,达到AOP的功能。
代理类中拥有实际类中所有的方法并且还有我们所需要的打印日志等功能代码,aop就是利用了反射动态调用,当需要日志功能时,就调用代理类中的方法,当不需要的时候,就调用实际类的方法。