1.ioc
1)设值注入
<bean id="helloworld" class="spring1.HelloWorld"> <property name="name" value="Spring"></property> </bean>
2)构造注入
按顺序 <bean id="car" class="spring1.Car"> <constructor-arg value="audi"></constructor-arg> <constructor-arg value="shanghai"></constructor-arg> <constructor-arg value="3000"></constructor-arg> </bean> 按类型 <bean id="car2" class="spring1.Car"> <constructor-arg value="audi" type="java.lang.String"></constructor-arg> <constructor-arg value="shanghai" type="java.lang.String"></constructor-arg> <constructor-arg value="3000" type="int"></constructor-arg> </bean> 混合使用 <bean id="car3" class="spring1.Car"> <constructor-arg value="audi" type="java.lang.String"></constructor-arg> <constructor-arg value="shanghai" index="1"></constructor-arg> <constructor-arg value="3000" type="int"></constructor-arg> </bean>
3)对特殊符号的处理
<value><![CDATA[<shanghai>]]></value>
4)bean之间的相互引用
<!— ref=“id” --> <bean id="person" class="spring1.Person"> <property name="name" value="tom"></property> <property name="age" value="28"></property> <property name="car" ref="car3"></property> </property>
5)内部bean
<bean id="person" class="spring1.Person"> <property name="name" value="tom"></property> <property name="age" value="28"></property> <property name="car"> <bean class="spring1.Car"> <constructor-arg value="audi" type="java.lang.String"></constructor-arg> <constructor-arg value="shanghai" index="1"></constructor-arg> <constructor-arg value="3000" type="int"></constructor-arg> </bean> </property> </bean>
6)级联
<!-- 级联属性 但是在 之前必须进行相应的初始化 -->
<property name="car.maxspeed" value="3000"></property>
7)集合属性的构建
List <list> <ref bean="car1"/> <ref bean="car2"/> <ref bean="car3"/> <!-- 内部bean的方式书写 --> <bean class="spring1.Car"> <constructor-arg value="audi" type="java.lang.String"></constructor-arg> <constructor-arg value="shanghai" index="1"></constructor-arg> <constructor-arg value="3000" type="int"></constructor-arg> </bean> </list> Map <property name="cars"> <map> <entry key="aa" value-ref="car"> </entry> <entry key="bb" value-ref="car1"> </entry> <entry key="cc" value-ref="car2"> </entry> </map> </property> Property <property name="properties"> <props> <prop key="user">root</prop> <prop key="password">cgz12345678</prop> <prop key="jdbcurl">jdbc:mysql:///test</prop> <prop key="driverclass">com.mysql.Driver</prop> </props> </property>
备注:在不能识别构造方法时,会执行最后一个满足条件的构造方法
8)实例工厂(用的少)
<bean id="factory" class="cn.spring.test.InstanceFactory" ></bean> <bean id="car1" factory-bean="factory" factory-method="getCar"> <constructor-arg value='audi'></constructor-arg> </bean> private Map<String,Car> cars=new HashMap<>(); public InstanceFactory() { cars.put("audi", new Car("audi", 300000)); cars.put("ford", new Car("ford", 400000)); } public Car getCar(String name){ return cars.get(name); }
9)静态工厂方法(用的少)
static{ cars.put("audi", new Car("audi", 300000)); cars.put("ford", new Car("ford", 400000)); } public static Car getCar(String name){ Car car = cars.get(name); return car; } <bean id="car" class="cn.spring.test.StatiCarFactory" factory-method="getCar"> <constructor-arg value="audi"></constructor-arg> </bean>
10)抽像bean
<!--不需要class,abstract=“true”--> <bean id="address2" p:city="shanghai" p:street="dongfang" abstract="true"></bean> <!--parent="address2"--> <bean id="address1" class="spring3.Address"parent="address2" p:street="haoxida"></bean> <!-- depends-on="car" 初始化前需要有一个id为car的bean--> <bean id="person" class="spring3.Person"p:name="tom" p:address-ref="address1" depends-on="car"></bean>
备注:di依赖注入,一个类依赖另外一个类,ioc控制反转,手动实例化bean变成自动实例化bean
11)执行
ApplicationContext ctx = new ClassPathXmlApplicationContext("xmlpath"); //根据id名获取对象 Car car1 = (Car) ctx.getBean("car1"); //根据类型名获取对象,且这个类型的id只能有一个否则报错 HelloWorld bean = ctx.getBean(HelloWorld.class);
12)util命名空间
单独bean
<!-- 配置独立的集合bean 需要导入util命名空间-->
<util:list id="list">
<ref bean="car1"/>
<ref bean="car2"/>
<ref bean="car3"/>
</util:list>
<!-- 加载资源文件 -->
<util:properties id="resource" location="path"></util:properties>
<!-- 暴露静态field -->
<util:constant id="age" static-field="Tese.age"/>
<!-- 暴露属性 -->
<util:property-path id="age" path="Test.age"/>
13 )p命名空间
<!-- p命名空间为bean的属性赋值 需要导入p命名空间 -->
<bean id="person" class="spring3.Person" p:name="tom" p:address-ref="address" p:car-ref="car" ></bean>
14)自动装配
// autowire="byName" 默认值no表示不进行自动装配,byname与bytype只能选一个 这个方法是存在弊端的 而且弊大于利,byname 根据bean的名字和当前的bean的setter风格的属性进行装配,当存在是就装配,不存在时就不装配,bytype 根据bean的类型和当前bean的属性的类型进行自动装配 若ioc存在一个以上,会抛出异常,一般很少用自动配置,在整合第三方框架的时候会使用
<bean id="person" class="spring3.Person" p:name="tom" autowire="byName"></bean>
2.作用域scope
songleton 默认值,表示单例模式,在这个周期类值创建一个bean只初始化一次,在创建容器的时候就已经创建好了
Prototype原型模式,在getbean的时候创建相应的bean,在容器创建的时候不会创建bean ,而是在每次getbean的时候都会创建新的bean
<bean id="car" class="spring3.Car" scope="prototype">
session对应于域对象的session,每次http session时创建一个bean对象,在web中使用时才有效
request对应于域对象的request,每次http request时创建一个bean对象,在web中使用时才有效
备注:Singletom依赖prototype的时候 会出现prototype不更新问题的解决方式
//steel为抽象类 getAxe为抽象方法
<,up-method name="getAxe" bean="steel"/>
对于getAxe方法由spring完成 源码如下
Public axe getaxe(){
Return ctx.getbean(“steel”)
}
3.Spring IOC 容器对 Bean 的生命周期进行管理的过程:
通过构造器或工厂方法创建 Bean 实例,为 Bean 的属性设置值和对其他 Bean 的引用,将 Bean 实例传递给 Bean 后置处理器的 postProcessBeforeInitialization 方法,调用 Bean 的初始化方法init,将 Bean 实例传递给 Bean 后置处理器的 postProcessAfterInitialization方法,Bean 可以使用了,当容器关闭时, 调用 Bean 的销毁方法destroy
备注:
1)init方法和destroy方法的指定(bean无需实现任何接口和继承)
<bean id="car" class="spring5.Car" init-method="init" destroy-method="destroy">
2)bean的后处理器
后处理需要实现 beanpostprocessor接口,在配置文件中添加初始化 如<bean class="spring5.Mybeanpostprocesse"></bean>
其中的两个方法
postProcessBeforeInitialization 方法 Bean 的初始化之前调用
postProcessAfterInitialization方法 Bean 初始化之后调用
4.注解
1) Spring没有采用约定大于配置
2) annotation注解
@configuration:用于修饰一个javabean
@bean:用于修饰一个方法,将该方法的返回值定义成容器中的一个bean,@bean{name=“chinese”} 配置一个bean:chinese
@value:用于修饰一个field,用于作为一个配置的值,@value{“张三”} 注入需要依赖注入的属性值
@import 修饰装配类 用于导入其他java配置类进行整合
@scope:修饰一个方法,指定scope生命域 @Scope("prototype")
@lazy 修饰一个方法 对应的bean是否延迟初始化,@lazy(true)延迟初始化
@dependon 修饰一个一个方法 初始化对应的bean之前初始化指定bean,依赖其他的bean,其中还有几个属性,类似于xml配置中的init和destroy
@importresource 导入xml配置
@importresource{“classpath:/bean.xml”}
3) 注解扫描组件
@Component: 基本注解, 标识了一个受 Spring 管理的组件
@Respository: 标识持久层组件
@Service: 标识服务层(业务层)组件
@Controller: 标识表现层组件
对于扫描到的组件, Spring 有默认的命名策略: 使用非限定类名, 第一个字母小写. 也可以在注解中通过 value 属性值标识组件的名称,当在组件类上使用了特定的注解之后, 还需要在 Spring 的配置文件中声明 <context:component-scan> :,base-package 属性指定一个需要扫描的基类包,Spring 容器将会扫描这个基类包里及其子包中的所有类 ,当需要扫描多个包时, 可以使用逗号分隔, 如果仅希望扫描特定的类而非基包下的所有类,可使用 resource-pattern 属性过滤特定的类
<context:component-scan base-package="spring7" resource-pattern="*.class">
<!-- contextexclude-filter 排除的类 -->
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
<!--annotation:根据注解指定expression ,提前设置 use-default-filters="false"后不会在默认添加filter ,context:include-filter才有作用,否则会默认的添加所有匹配的值-->
<context:include-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
<!-- assignable根据包名点类名指定expression -->
<context:include-filter type="assignable" expression="spring7.UserRepositoryimp"/>
</context:component-scan>
<context:include-filter> 和 <context:exclude-filter> 子节点支持多种类型的过滤表达式
4) 自动装配
@ Autowired:可用于多个参数的普通方法传递参数,也可以用于构造方法传递参数和field
@Autowired属性
Name:属性名自动装配
Type:根据属性的类型自动装配,没有bean什么都不会发生,多个相同类型报出异常
Auto:spring插件会自动检查需要哪种自动装配的类型
Constructor:与type相似,区别是使用构造器来构造注入需要的参数
@Autowired(required=false)表示即使没有这个属性相匹配的类也不会报错
当存在多个匹配时(多态或者继承)
那么可以通过@Controller(value)指定value的值,优先匹配属性名与value一致的值,或者@Qualifier(value)指定
@resource可以注释setter方法的参数和属性
@resource()
Private person ps;
注解要求提供一个 Bean 名称的属性,若该属性为空,则自动采用标注处的变量或方法名作为 Bean 的名称
类似于property的ref
@Inject
@Inject和 @Autowired 注解一样也是按类型匹配注入的 Bean, 但没有 reqired 属性
5) 作用域
@scope
如:@scope(“prototype”)
6)@dependon
依赖,可修饰bean类和方法,需要初始化其他bean
7)@lazy
Boolean参数,指定是否预初始化该bean
8)泛型注入
Spring 4 中可以为子类注入子类对应的泛型类型的成员变量的引用