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方法
- 构造器注入,通过调用构造器
- 接口注入,(较少)
Spring本质
- Spring对的配置 通过xml配置来驱动Java
- xml<--------->java
- bean元素:_ 驱动使用nem调用构造器: ”默认它总是调用无参 数的构造器。如果想控制它调用有参数的构造器,就需要在<bean... />元素里添加 <constructor -arg.../>子元素每个该元素代表个构造器参数。 Sconstructor-arg...八子元素里yalue属性指定的值优先被当成String类处理。 为了明确地指定该值的类型,可以指定type属性。
- property元素: 驱动它调用setter方法。对象创建出来之后, setter立 即就会被调用。
- constructor- arg元素:驱动调用有 参数的构造器
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的值。所有构造器是自己配置的,同时当构造器有参数,时,就没有无参构造器了。
初始化就是把bean里面的set和构造器都重新运行一遍
- 如果想要取消初始化,只要为<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不会主动初始化。