Spring神经元(第二根)

103 阅读3分钟

Spring结构

前期回顾

IOC( Context ,Bean(Bean 对spring来说,bean就是类), spel )

AOP (Aspect . Instrument)

结构

支持

前端 Spring MVC , Servlet Portlet 中间 Spring(核心:IOC和AOP) 后端 Spring Data, 与其他的ORM框架整合 JDBC(整合,封装)

Spring核心

控制反转(依赖注入)

控制反转,

  • 主动new一个对象
  • A依赖B,通过工厂获取B的Bean
  • A依赖B时,A不再主动去获取B,而是被动等待容器提供B对象。

当A对象依赖B对象时,不管你是主动new还是用过容器获取B对象,都是A对象主动获取 但当使用容器方式后,A对象只要被动等待容器位之提供B对象 二容器则是负责位A对象"注入" 它所依赖对象即可。 从容器角度来看,容器负责注入 对A来角度来看,调用原来要主动获取的依赖对象,现在只需要被动等待容器的注入,调用者是“控制反转”.

注入方式

  • 设值注入,通过调用set方法
  • 构造器注入,通过调用构造器
  • 接口注入,(较少)

image.png Spring本质

  • Spring对的配置 通过xml配置来驱动Java
  • xml<--------->java
  • bean元素:_ 驱动使用nem调用构造器: ”默认它总是调用无参 数的构造器。如果想控制它调用有参数的构造器,就需要在<bean... />元素里添加 <constructor -arg.../>子元素每个该元素代表个构造器参数。 Sconstructor-arg...八子元素里yalue属性指定的值优先被当成String类处理。 为了明确地指定该值的类型,可以指定type属性。
  • property元素: 驱动它调用setter方法。对象创建出来之后, setter立 即就会被调用。
  • constructor- arg元素:驱动调用有 参数的构造器

image.png

BeanFactory的方法 1.boolean containsBean(String name) :判断Spring容器是否包含id为name的Bean实例。 2.Object getBean(String name) :返回容器中id为name的Bean实例。 3.Object getBean(String name, Class requiredType) :返回容器中id为 4.name,并且类型为requiredType的Bean。 5.Class getType(String name) :返回容器中指定Bean实例的类型。

Application方法 1.ApplicationContext会初始化所有的singleton Bean。

何谓singleton Bean 如果不加特色配置,这个bean就是singleton Bean

//一个类里面的set方法
public void setName(String name) {  
    System.out.println("====setname====");  
    this.name = name;  
}

public Dog(int age) {  
    System.out.println("=====构造器====");  
    this.age = age;  
}
//Dog配置
<bean id="dog" class="com.example.ssm.day2.Dog">  
    <constructor-arg value="2"/>  
    <!--去掉set方法的set前缀,name是属性名字-->  
    <property name="name" value="旺财"/>  
</bean>

在spring初始化时,Bean首先调用构造器,然后是set,很明显我只在Bean中配置了一个setName的值。所有构造器是自己配置的,同时当构造器有参数,时,就没有无参构造器了。

image.png 初始化就是把bean里面的set和构造器都重新运行一遍

  1. 如果想要取消初始化,只要为<bean... />元素增加lazy-init=" true"即可。只有等程序去获取该Bean时才会去初始化。

public class Test {  
    public static void main(String[] args) {  
        //初始化spring容器,  
//        ApplicationContext ctx = new ClassPathXmlApplicationContext("Bean2.xml");  
        Resource res = (Resource) new ClassPathResource("Bean2.xml");  
        BeanFactory ctx = new XmlBeanFactory(res);  
        System.out.println("-------------");  
        Dog dog = (Dog) ctx.getBean("dog");  
    }  
}

当我们使用ApplicationContext时,会自动初始化。 BeanFactory不会主动初始化。