一.基本概念
1.1 Spring
1.Spring是为简化企业级开发而生,它实际上是为我们封装了许多的组件,如common相关包,数据连接相关包(ORM:mybatis等),web(jsp)等。是一个框架,是一个整体的解决方案。
2.spring最重要的就是依赖注入(DI)和控制反转(IOC)。实际上,依赖注入是控制反转的具体实现,控制反转是一种思想。传统意义上,我们想调用一个方法,需要先创建目标对象,再根据对象调用对象方法。而控制反转的思想是,我们不需要关注目标对象是如何被创建的,而只需要交给sping框架的IOC容器,我们只需要根据这个容器对象获取到目标对象,再使用目标对象调用对象方法。至于容器是如何创建出目标对象的,不需要关心。(实际上,可以简单理解为容器就是一个抽象工厂,负责创建需要的对象)
1.2 Spring的几种方式
1.2.1. 基于xml的配置方式,使用的全类名的方式 如在xml文件中:
<bean id="person" class="com.atguigu.spring.helloworld.Person">
<property name="name" value="zhangsan"></property>
</bean>
其中: <-bean>:受Spring管理的一个javaBean对象; id:<-bean>的唯一标识,在整个配置文件或IOC容器中唯一不重复。 class:指定javaBean的全类名,目的是通过反射创建对象。实质上,其IOC容器对象创建出目标对象大致可描述为如下:
Class cls = Class.forName("全类名");
Object obj = cls.newInstance();//必须提供好无参构造函数
这样便可得到目标对象,经过外部强制类型转换可得到目标对象类型。
<property> :给对象赋值
name:指定属性名,指定set风格的属性名
value:指定属性值
这里实际上是相当于调用set方法进行赋值。 如在Main方法中:
//1.创建Spring的IOC容器对象
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");//xml文件名
//2.获取Person对象
Person person = (Person)ctx.getBean("person");//id
或者Person person = (Person)ctx.getBean(Person.Class);//class全类名,但不支持xml中同一类的多个对象获取
或者Person person = (Person)ctx.getBean(“person”,Person.Class);//id+class全类名,精确定位某类的某个对象,推荐
//3.调用方法
person.sayHello();
1.2.2 p名称空间 ????为了简化xml文件的配置,越来越多的xml文件采用属性而非子元素配置信息,spring从2.5版本开始引入了一个新的p命名空间,可以通过<bean> 元素属性的方式配置bean的属性。 如在xml中:
<bean id="person3" class="com.atguigu.spring.helloworld.Person"
p:name="zhangsan" p:sex="male">
</bean>
????采用这种方式后,在Person类中便不需要书写set方法。
1.3 深度解析
1.实质上,在Spring中有两种IOC容器 ??(1)BeanFactory:IOC的基本实现,是spring内部的基础设施,是面向spring本身的,不是提供给开发人员的; ?? (2)ApplicationContext:BeanFactory的子接口,提供了更多高级的特性,面向spring的使用者,几乎所有场合使用ApplicationContext,而不是底层的BeanFactory。
2.依赖注入的方式 ??(1)通过bean的setXXX()方式进行注入; ???? 如在xml文件中:
<bean id="person" class="com.atguigu.spring.helloworld.Person">
<property name="name" value="zhangsan"></property>
<property name="sex" value="male"></property>
</bean>
????这种方式是通过person类中的set方法进行注入,所以缺少set方法时会出错,除此之外,spring框架中采用此方法时也会用到该类的无参构造方法,所以如果写了多个构造函数,则必须显示的编写无参构造函数才不会出错。 (2)通过bean的构造器赋值 ?? 1)Spring自动匹配合适的构造器 ????顾名思义,就是采用参数构造函数匹配方式来进行注入,需要在Person类中编写无参构造函数以及有参构造函数。 如在xml文件中:
<bean id="person" class="com.atguigu.spring.helloworld.Person">
<constructor-arg value="zhangsan"></constructor-arg>
<constructor-arg value="male"></constructor-arg>
</bean>
????这种方式就是使用构造器进行对象赋值,对象属性值与构造方法参数列表依次对应,对应出错会导致报错。此外,需要注意的是,bean的作用域问题,默认情况下,spring 容器被创建的时候,bean对象就被创建了,因此只要创建spring IOC容器,那么就默认会调用set方式的注入。还有重要的一点是,spring会根据构造器的参数类型去匹配对应构造器,如果类中除了构造方法外,还包括其他方法,那么采用构造器方式进行赋值时,spring优先匹配最先找到的合适的参数类型的构造器进行赋值(从下向上依次扫描构造器方法),而当类中只有构造方法时,则会匹配合适的参数类型较大的构造器方法。 ????除了按照参数类型匹配构造器之外,还有index:指定参数位置(value="xxx" index="0" )、type:指定参数类型的构造器赋值方式(value="xxx" index="0" type=“java.lang.Double” )。
1.4 注意点
1.字面量 ??(1)可以使用字符串表示的值,可以通过value属性或者value子节点的方式指定。 ??(2)基本数据类型及其封装类、String等类型都可以采取字面值注入方式; ??(3)若字面量中包含特殊字符,可以使用实体把字面值包裹起来。如: ????1)在w3school手册中进行查询,如:
.
& &
< <
> >
" "
如:
<bean id="person" class="com.atguigu.spring.helloworld.Person">
<property name="name" >
<value><<Java编程思想>></value>
</property>
</bean>
或者:
<bean id="person" class="com.atguigu.spring.helloworld.Person">
<property name="name" value="<<Java编程思想>>">
<value><<Java编程思想>></value>
</property>
</bean>
????2)<![CDATA[任意字符]]> 的方式,如:
<bean id="person" class="com.atguigu.spring.helloworld.Person">
<property name="name">
<value><![CDATA[《Java编程思想》]]></value>
</property>
</bean>
|