Spring ioc 常用 详解
Posted yuing
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring ioc 常用 详解相关的知识,希望对你有一定的参考价值。
[TOC]
Spring容器
配置对象时默认的单例的
可以设置bean的scope属性
- singleton 单例模式,只会在IOC容器初始化的时候创建bean,并且只会创建一次
- prototype 原型模式,在每次获取bean的时候才会创建bean,并且每次获取都会创建一个新的对象
- session 每个会话共享一个bean
- request 每个请求共享一个bean
配置的方式
- 通过 属性名 对应 属性值 进行配置
- 通过类的构造进行配置
- 当一个javaBean中包含对像的属性时 可以通过(ref)引用的方式配置
- list,map,set
<list>
<ref bean="beanId"/>
</list>
<set>
<ref bean="beanId"/>
</set>
<map>
<entry key="AA" value-ref="b1"/>
<entry key="BB" value-ref="b2"/>
</map>
- bean 自动配置
通过autowire可以实现bran的自动配置- autowire="byName" 要求属性名与对象Bean的id相同
- autowire="byType" 要求自动配置的属性对象的类型与属性的类型一致且唯一
配置 Properties
<property name="properties"> <props> <prop key="driverClassName">oracle.jdbc.driver.OracleDriver</prop> <prop key="url">jdbc:oracle:thin:@127.0.0.1:1521:XE</prop> </props> </property>
注解配置
<context:component-scan base-package="com.yuing.spring1"/><!--开启自动扫描组建-->
- @Component 任意的java类
- @Controller 控制层
- @Repository DAO层
- @Service 业务层
配置过滤器
- exclude-filter 不包含过滤的条件
- include-filter 包含过滤的条件 (在使用时应先关闭默认的过滤器
use-default-filters="false"
) - type有五种类型
aspectj | assignable | custom | regex | annotation 根据注解过滤 |
---|---|---|---|---|
org.springframework.stereotype.Component //@Component(任意一个类) | ||||
org.springframework.stereotype.Repository //@Repository | ||||
org.springframework.stereotype.Service //@Service | ||||
org.springframework.stereotype.Controller //@Controller |
自动注入:@Autowire 标签贴在对象上 在容器中返回对象
<context:component-scan base-package="包名">
<context:exclude-filter type="过滤的条件类型" expression="条件"/>
</context:component-scan>
<context:component-scan base-package="包名" use-default-filters="false">
<context:include-filter type="过滤的条件类型" expression="条件"/>
</context:component-scan>
给bean的属性设置特殊值
设置特殊字符串 "<",">"
<!-- 在value标签中的<![CDATA[value]]> 中设置属性的值 --> <property name="propertyName"> <value><![CDATA[<Java开发>]]></value> </property>
设置空置
<property name="propertyName">
<null/>
</property>
标签 属性
- bean标签 配置javaBean对象
- util标签 声明(list,map,set,property)
- p标签 bean标签的属性 p:属性名="属性值"
context标签 加载外部文件
abstract:将bean的abstract属性设置为true时,该bean只能作为模板bean,不会被容器初始化
子bean通过 parent="beanId" 加载模板
bean的生命周期
ClassPathXmlApplicationContext 容器 被初始化时里面的bean就都被创建ClassPathXmlApplicationContext 销毁时 bean 也跟着销毁
bean的属性
init-method="" :可以指定当bean加载成功后执行一个bean对象中的初始化方法
destroy-method="" :可以指定当bean即将销毁时 执行一个bean对象中的销毁的化方法
配置druid连接池 加载properties文件 调用其中的值
- 加载properties文件
<context:property-placeholder location="classpath:db.properties"/>
<bean class="com.alibaba.druid.pool.DruidDataSource" id="dataSource">
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
<property name="url" value="${url}"/>
<property name="driverClassName" value="${driverClassName}"/>
</bean>
SPEL:Spring的表达式语言
#{beanId} 引用其他的bean对象
#{beanId.pro} 引用其他bean对象的属性值
#{beanId.methodName()} 调用方法得到返回值
#{田间 ? ‘真的返回值‘ : ‘假返回值‘} 三目运算
工厂Bean (FactoryBean
public class CarFactoryBean implements FactoryBean<Car> {} //以Car类为例
- 配置的方式
<bean id="car" class="com.hwua.spring02.factory.CarFactoryBean"/>
Bean后置处理器(初始化之前 和初始化之后执行)
配置:
<bean class="com.hwua.spring02.util.MyPostProcessor"/>
java代码:
public class MyPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object o, String s) throws
//参数 o: Bean对象 s: Bean的id
BeansException {
System.out.println("MyPostProcessor.Before : "+o+",s:"+s);
if(o instanceof Book){
//是book
}else if (o instanceof Car){
//是Car
}
return o;
}
@Override
public Object postProcessAfterInitialization(Object o, String s) throws BeansException {
System.out.println("MyPostProcessor.After : "+o+",s:"+s);
return o;
}
}
java工厂类的配置(了解)
Java代码
public class StaticCarFactory {
private static Map<String,Car> carMap = new HashMap<>();
static {
Car bmw = new Car();
bmw.setBrand("BMW");
bmw.setPrice(9.9);
Car audi = new Car();
audi.setBrand("audi");
audi.setPrice(19.9);
carMap.put("BMW",bmw);
carMap.put("audi",audi);
}
public static Car createCar(String brand){
return carMap.get(brand);
}
}
xml代码
<!--静态工厂创建对象不需要实例化工厂类-->
<bean id="car" class="com.hwua.spring02.factory.StaticCarFactory"
factory-method="createCar">
<constructor-arg [name="参数名"] value="audi"/>
</bean>
<!--实例工厂需要先实例化工厂类-->
<bean id="carFactory" class="com.hwua.spring02.factory.InstanceCarFactory"/>
<!--使用工厂类创建Car对象-->
<bean id="car1" factory-bean="carFactory" factory-method="createCar">
<constructor-arg [name="参数名"] value="audi"/>
</bean>
在Java类中使用:
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");//创建容器的对象
ac.getBean(Class<T>|"IdString");//获取javaBean对象 当一个类配置了多个javabean时通过类和id可以锁定一个JavaBean
@Autowired //自动装配(默认是根据class)
@Qualifier("bookServer") //根据id进行装配
BookServer bookServer;
实例
<?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 id="person1" class="com.yuing.spring1.User">
<property name="age" value="18"/>
<property name="name" value="张三"/>
<property name="book" ref="b1"/>
<property name="book.name" value="oracle基础"/>
<property name="book.price" value="99.8"/>
</bean>
<!--简单的javaBean-->
<bean id="person2" class="com.yuing.spring1.User">
<constructor-arg value="李四" name="name"/>
<constructor-arg value="20" name="age"/>
</bean>
<bean id="person3" class="com.yuing.spring1.User">
<constructor-arg value="李四" index="0"/>
<constructor-arg value="20" index="1"/>
</bean>
<bean id="b1" class="com.yuing.spring1.pojo.Book">
<property name="name" value="java基础"/>
<property name="price" value="3.5"/>
</bean>
</beans>
以上是关于Spring ioc 常用 详解的主要内容,如果未能解决你的问题,请参考以下文章