spring的工作原理
一、 IoC(Inversion of control): 控制反转
1、IoC:
概念:控制权由对象本身转向容器;由容器根据配置文件去创建实例并创建各个实例之间的依赖关系
核心:bean工厂;在Spring中,bean工厂创建的各个实例称作bean
二、AOP(Aspect-Oriented Programming): 面向方面编程 (其实我的理解是,通过配置文件来实现模块和模块,对象和对象的分离。)
1、 代理的两种方式:
静态代理:
- 针对每个具体类分别编写代理类;
- 针对一个接口编写一个代理类;
动态代理:
针对一个方面编写一个InvocationHandler,然后借用JDK反射包中的Proxy类为各种接口动态生成相应的代理类
2、 AOP的主要原理:动态代理
Spring工作原理
Spring 已经用过一段时间了,感觉Spring是个很不错的框架。内部最核心的就是IOC了,
动态注入,让一个对象的创建不用new了,可以自动的生产,这其实就是利用java里的反射
反射其实就是在运行时动态的去创建、调用对象,Spring就是在运行时,跟xml Spring的配置
文件来动态的创建对象,和调用对象里的方法的 。
Spring还有一个核心就是AOP这个就是面向切面编程,可以为某一类对象 进行监督和控制(也就是
在调用这类对象的具体方法的前后去调用你指定的 模块)从而达到对一个模块扩充的功能。这些都是通过
配置类达到的。
Spring目的:就是让对象与对象(模块与模块)之间的关系没有通过代码来关联,都是通过配置类说明
管理的(Spring根据这些配置 内部通过反射去动态的组装对象)
要记住:Spring是一个容器,凡是在容器里的对象才会有Spring所提供的这些服务和功能。
Spring里用的最经典的一个设计模式就是:模板方法模式。(这里我都不介绍了,是一个很常用的设计模式)
Spring里的配置是很多的,很难都记住,但是Spring里的精华也无非就是以上的两点,把以上两点跟理解了
也就基本上掌握了Spring.
目录 |
- Spring框架的概念
- Spring中IOC
- Spring框架原理
- beanFactory和AppilcationContext的区别
一.Spring框架的概念 |
Spring是一个开源容器框架,可以接管web层,业务层,dao层,持久层的组件,并且可以配置各种bean,和维护bean与bean之间的关系。其核心就是控制反转(IOC),和面向切面(AOP),简单的说就是一个分层的轻量级开源框架。
二.Spring中的IOC |
IOC:(全称:Inverse Of Control )控制反转,容器主动将资源推送给它所管理的组件,组件所做的是选择一种合理的方式接受资源。
简单的理解:把创建对象和维护之间的关系的权利由程序中转移到Spring容器的配置文件中。
DI:(全称:Dependency Injection)依赖注入,IOC的另一种表现方式,组件以一种预先定义好的方式来接受容器注入的资源。
三.Spring框架原理 |
1.例子:
建一个person类
1 public class Person { 2 3 private String name; 4 5 private int age; 6 7 private Book book; 8 9 public String getName() { 10 return name; 11 } 12 13 public void setName(String name) { 14 this.name = name; 15 } 16 17 public int getAge() { 18 return age; 19 } 20 21 public void setAge(int age) { 22 this.age = age; 23 } 24 25 public Book getBook() { 26 return book; 27 } 28 29 public void setBook(Book book) { 30 this.book = book; 31 }
建一个Book类
1 public class Book { 2 3 private String name; 4 5 private int price; 6 7 private String place; 8 9 public String getName() { 10 return name; 11 } 12 13 public void setName(String name) { 14 this.name = name; 15 } 16 17 public int getPrice() { 18 return price; 19 } 20 21 public void setPrice(int price) { 22 this.price = price; 23 } 24 25 public String getPlace() { 26 return place; 27 } 28 29 public void setPlace(String place) { 30 this.place = place; 31 } 32 }
applicationContext.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的配置文件 --> <bean id="person" class="org.jingdong.bean.life.Person"> <property name="name" value="grl"></property> <property name="age" value="11"></property> <property name="book" ref="book"></property> </bean>
<bean id="book" class="org.jingdong.bean.life.Book"> <property name="name" value="think in java"></property> <property name="place" value="USA"></property> <property name="price" value="79"></property>
</beans>
Main.java
1 public class Main { 2 public static void main(String[] args) { 3 // 创建IOC容器 4 ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml"); 5 //从容器中获取bean实例 6 Person person = (Person) ac.getBean("person"); 7 //使用bean 8 System.out.println(person.getName()); 9 } 10 }
2.运行原理分析:
(1).当ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext .xml");被执行时,Spring容器对象被创建,同时applicationContext .xml中的bean就会被创建到内存中:
(2)运行原理图:
四.beanFactory和ApplicationContext的区别 |
配置bean的方式:
(1).通过ApplicationContext上下文容器:当在加载xml配置文件时,配置文件中的配置的bean已经被实例化
(2).BeanFactory:在加载配置文件时,配置文件中的bean不被实例化,只有当通过getBean(),获取bean实例的时候才被创建。
总结:通过BeanFactory配置的bean比通过ApplicationContext配置的节约内存。
--------------------------------------谢谢观看------------------------------------------------