• 1.1浅谈Spring(一个叫春的框架)


    如今各种Spring框架甚嚣尘上,但是终归还是属于spring的东西。所以在这里,个人谈一谈对spring的认识,笔者觉得掌握spring原理以及spring所涉及到的设计模式对我们具有极大的帮助。我们基于what ,why ,how来研究Spring。

    Spring是什么?

    Spring为什么?

    如何使用Spring?

    关于这三个问题可以先自行百度!!!针对这个3个问题提出以下几点。

    Spring有三大地方值得注意:

    1.IOC容器

    2.IOC控制反转和DI依赖注入

    3.AOP面向切面编程

    首先谈一下这个IOC容器:

    提到容器,我们最先就能想到的就是WEB容器,那么WEB容器是干什么的?WEB容器就是用来对servlet管理,创建,销毁等一些操作的东西。通俗的讲,servlet“住”在WEB容器,它的一切都与这个容器有关。所以IOC容器也有这么一个概念,但是他是用来管理Bean的,Bean之于Spring就相当于对象之于java。java是面对对象编程,而spring是面向Bean编程的。Spring IoC容器如何知道哪些是它管理的对象呢?这就需要配置文件,Spring IOC容器通过读取配置文件中的配置元数据,通过元数据对应用中的各个对象进行实例化及装配。一般使用基于xml配置文件进行配置元数据,而且Spring与配置文件完全解耦的,可以使用其他任何可能的方式进行配置元数据,比如注解、基于java文件的、基于属性文件的配置都可以。这就需要提出第二个概念IOC和DI了。

    DI依赖注入:这里首先声明一点:IOC容器是一个容器,而IOC就是一个概念性的东西。这就好比,我是TOM,而TOMCAT就是TOM的猫而跟TOM这个人不是一个物种。

    IOC是“Inversion of Control“的缩写,翻译过来就是控制反转。为什么说它是控制反转呢?我们可以用程序来描述一下:

    public class WQ {
    	int x;
    }
    

    这里有一个类WQ

    平常我们要使用的话一般都是自己去创建一个

    public static void main(String[] args) {
    		WQ wq = new WQ();
    	}
    

    但是如果用Spring呢?

    @Autowired
    private WQ wq;
    

    这里是基于注解的注入方式。加上这个注解IOC容器就会在Spring的配置文件中自行查找。这就相当于本来我们是全权来控制这个对象的,而在我们队这个对象添加了@Autowired之后,IOC容器就会自动去创建,这就相当于我们把控制权交给了IOC容器。所以就叫控制反转。可能有人会问为什么private属性的对象也可以呢?不好意思,Spring就是可以为所欲为。

    但是,Spring并不是只有注解这一种方式,只是注解开发的效率高,所以基本都用注解开发了。DI依赖注入有4种方式:

    ①通过接口注入

    这里的接口注入又分为两种模式:1.静态工厂模式 2.非静态工厂模式

    创建需要实例化的类

    类中必须带有无参构造器,因为IOC容器是通过反射的方式来创建对象的。

    public class Car {
    	
    	public Car() {}
    	
    	private String brand;
    	private double price;
    
    	public Car(String brand, double price) {
    		super();
    		this.brand = brand;
    		this.price = price;
    	}
    	public String getBrand() {
    		return brand;
    	}
    
    	public void setBrand(String brand) {
    		this.brand = brand;
    	}
    
    	public double getPrice() {
    		return price;
    	}
    
    	public void setPrice(double price) {
    		this.price = price;
    	}
    }
    

    静态工厂模式:这种工厂模式必须先创建工厂类

    public class StaticCarFactoty {
    	
    	private static Map<String , Car > cars = new HashMap<String ,Car>();
    	
    	static {
    		cars.put("Audi", new Car("Audi",300000));
    		cars.put("Ford", new Car("Ford",200000));
    	}
    	
    	public static Car getCar(String name) {
    		return cars.get(name);
    	}
    }
    

    XML的配置

    <!--class要写工厂的类;factory-method要写工厂类中用于创建bean的方法-->
    <bean id="car1" class="com.wq.factory.StaticCarFactoty"
    		factory-method="getCar">
    <constructor-arg value="Audi"></constructor-arg>
    </bean>
    

    非静态模式:这要创建工厂类,并在XML中实例化工厂

    public class InstanceCarFactory {
    	private Map<String,Car> cars =null;
    	
    	public InstanceCarFactory() {
    		// TODO Auto-generated constructor stub
    		cars = new HashMap<String,Car>();
    		cars.put("Audi", new Car("Audi",300000));
    		cars.put("Ford", new Car("Ford",200000));
    	}
    	
    	public Car getCar(String brand) {
    		return cars.get(brand);
    	}
    }
    

    XML配置

    <!-- 通过实例工厂方法,需先实例工厂 -->
    <bean id="Carfactory" class="com.wq.factory.InstanceCarFactory"></bean>
    <!-- 配置bean -->
    <bean id="car2" factory-bean="Carfactory" factory-method="getCar">
    	<constructor-arg value="Ford"></constructor-arg>
    </bean>
    

    ②通过Setter方法注入

    XML配置

    <bean id="car3" class="com.wq.enties.Car">
    	<property name="brand" value="BMW"></property>
            <property name="price" value="400000"></property>
    </bean>
    

    ③通过构造器注入

    XML配置

    <bean id="car4" class="com.wq.enties.Car">
    	<constructor-arg value="Benz" index="0"></constructor-arg>
    	<constructor-arg value="800000" index="1"></constructor-arg>
    </bean>
    

    这里构造器注入必须使在这个类中存在这个构造器,index表示该参数在构造器中是第几个。

    也可以使用通过类型指定

    <bean id="car4" class="com.wq.enties.Car">
    	<constructor-arg value="800000" type="java.lang.Double"></constructor-arg>
    	<constructor-arg value="Benz" type="java.lang.String"></constructor-arg>
    </bean>
    

    ④通过注解方式注入

    就如同之前说的在需要实例化的类上添加@Autowired

    最后就来讲一下AOP了

    AOP是叫面向切面编程,主要是找到横切关注点。这段话说起来很绕口,实际上我们可以认为它是在找规律,或者直接说是找到一个合适的规则。AOP的核心思想就是独立开发,一起运行。用两个字来形容的话就是:解耦。

    AOP就是从多个业务中找到相同的部分并他们模块化,并在需要使用到这些相同的模块的时候用注解的形式来添加,体现了可重用性。如日志的输出,事务的开启关闭等。

    以上,就是个人对spring特点的浅谈,后续会增加从源码的角度来分析。

    希望各路豪杰不宁赐教,有不同理解的可在下方评论区讨论。

  • 相关阅读:
    Android中的Looper , Handler , Message有什么关系
    理解Android系统的进程间通信原理(二)----RPC机制
    深入浅出JVM
    Linux个人常用命令汇总
    垃圾收集器与内存分配策略
    Linux上部署Java应用+Python3环境搭建
    List中remove元素的理解
    Java异常
    深入理解Java 8 Stream
    深入理解Java 8 Lambda
  • 原文地址:https://www.cnblogs.com/Qiansion/p/9780658.html
Copyright © 2020-2023  润新知