Spring-IOC-学习笔记(2)

通过P命名空间给属性赋值:

<!-- 需要先导入P命名空间 -->
    <bean id="person4" class="spring.beans.Person" p:name="ben" p:cars-ref="cars"></bean>

bean自动装配:
SpringIOC容器可以自动装配Bean,需要在的autowire属性里指定自动装配的模式
byType:根据类型自动装配,若IOC容器中有多个与目标bean类型一致的bean,在这种情况下,Spring将无法判定哪个bean最合适该属性,所有不能自动装配。
byName:根据名称自动装配,根据bean的名称和当前bean的属性名称进行自动装配

<bean id="person5" class="spring.beans.Person" p:name="xiao" autowire="byName"></bean>

bean之间的关系:继承,依赖
继承配置:

<!-- 重复的属性值可以从其他bean继承,并且重写写入的数值会覆盖继承的属性值 -->
    <bean id="car" class="spring.beans.Car">
        <constructor-arg value="audi" index="0"></constructor-arg>
        <constructor-arg value="30.12" index="1"></constructor-arg>
    </bean>
    <bean id="car3" p:speed="132" parent="car"></bean>

子bean从父bean中继承配置,包括bean的属性配置,子bean也会覆盖从父bean继承的配置
若只是把父bean作为模版,可以设置<bean>的abstract属性为true,这样Spring不会实例化这个bean
并不是<bean>中的所有属性都会被继承,如:autowire、abstract等
也可以忽略父bean的class属性,让资bean指定自己的类,但此时abstract必须设为true

依赖:配置本bean时必须要配置依赖的这个bean,依赖的这个bean可以不用是本bean的属性
通过depends-on属性设定bean的前置依赖bean,前置依赖的bean会在本bean实例化之前创建好,如果前置依赖于多个bean,则可以用逗号或空格的方式配置bean名称。

<bean id="person" class="spring.beans.Person" depends-on="car">
        <property name="name" value="Tom"></property>
    </bean>

bean的作用域:
使用bean的scop属性配置bean的作用域
singleton:默认值,容器初始化创建bean的实例,在整个容器中只创建一个bean实例,是单例的
prototype:原型的,容器初始化时不创建bean的实例,每次请求时都创建一个bean实例并返回

导入外部属性文件:
使用${propName}引用属性文件的属性

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="user" value="${jdbc.username}"></property>
        <property name="password" value="${jdbc.password}"></property>
        <property name="driverClass" value="${jdbc.driver}"></property>
        <property name="jdbcUrl" value="${jdbc.url}"></property>
    </bean>
    <!-- 导入属性文件 -->
    <context:property-placeholder location="classpath:db.properties" />

SpEL
Spring表达式语言(SpEL):是一个支持运行时查询和操作对象图的强大的表达式语言
语法类似于EL:使用#{…}作为定界符,所有在框号中的字符都被认为是SpEL
SpEL为bean的属性进行动态赋值提供了便利,可以实现:
1.通过bean的id对bean进行引用
2.调用方法以及引用对象中的属性
3.计算表达式的值
4.正则表达式的匹配

字面量:

<property name="Tom" value="#{4.2}"></property>
<property name="Tom" value="#{1e4}"></property>
<property name="Tom" value="#{'abc'}"><property name="Tom" value="#{"abc"}"></property>
<property name="Tom" value="#{false}"></property>

SpEL引用bean、属性和方法
引用其他对象:

<property name="Tom" value="#{person}"></property>

引用其他对象得属性:

<property name="Tom" value="#{person.name}"></property>

调用其他方法,可以链式操作:

<property name="Tom" value="#{person.toString()}"></property>
<property name="Tom" value="#{person.toString().toUpperCase()}"></property>

支持算数运算符:+ - * / ^
加号可用作字符串拼接
比较运算符:== >= <= > <
逻辑运算符:and or not
if-else运算符:? : (三元操作符)
正则表达式:matches
调用静态方法或静态属性:通过T()调用,返回一个Class Object,然后调用相应的方法及属性:

<property name="Tom" value="#{T(java.Lang.Math).PI}"></property>

Bean的生命周期
IOC容器可以管理bean的生命周期,允许在bean生命周期的特定点执行定制的任务
IOC容器对bean生命周期的管理过程:
1.通过构造器或工厂方法创建bean的实例
2.为bean的属性设值和对其他bean的引用
3.调用bean的初始化方法
4.使用bean
5.当容器关闭时,调用bean的销毁方法
在bean的声明里设置init-method和destroy-method属性指定初始化和销毁方法

创建bean后置处理器:
bean后置处理器允许在调用初始化方法前后对bean进行额外的处理,对IOC容器中的所有bean实例逐一处理
典型应用:检查bean属性的正确性和根据特定的标准更改bean的属性
对bean后置处理器要实现BeanPostProcessor接口,
并具体提供postProcessAfterInitialization(Object bean, String beanName)和postProcessBeforeInitialization(Object bean, String beanName)方法。
注意:这两个方法完成后需要返回bean实例,否则bean无法执行初始化方法。可以在以上两个方法中修改bean或返回新的bean

<!-- 配置bean后置处理器,不需要配置id,IOC容器自动识别是一个BeanPostProcessor-->
    <bean class="spring.beans.MyBeanProcessor"></bean>

通过静态工厂方法创建bean

将对象创建的过程封装到静态方法中。只需简单调用静态方法,而不用关心创建对象得细节。
静态工厂方法类:

public class StaticFactory {
    private static Map<String,Car> cars = new HashMap<String,Car>();

    static {
        cars.put("audi", new Car("aodi",30));
        cars.put("bmw", new Car("bmw",34));
    }
    private static Car getCar(String name) {
        return cars.get(name);
    }
}

配置:

<!-- 静态工厂配置bean,注意是配置bean实例不是配置静态工厂方法实例
    class属性指向静态工厂方法的全类名 -->
    <bean id="car" class="spring.beans.StaticFactory" factory-method="getCar">
        <constructor-arg value="audi"></constructor-arg>
    </bean>

获取实例bean:

ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("beans-scop.xml");
        Car car = (Car) ctx.getBean("car");

通过实例工厂方法创建bean

将对象创建的过程封装到另外一个实例的方法里
声明通过实例工厂方法创建bean,在bean的factory-bean属性里指定拥有该工厂方法的bean,在factory-method属性里指定工厂方法的名称,使用constructor-arg元素为工厂方法传递方法参数

实例工厂方法类:

public class CarFactory {
    private Map<String,Car> cars = null;
    public CarFactory() {
        cars = new HashMap<String, Car>();
        cars.put("audi", new Car("aodi",30));
    }

    public Car getCar(String name) {
        return cars.get(name);
    }
}

配置:

<!-- 配置工厂实例 -->
    <bean id="carFactory" class="spring.beans.CarFactory"></bean>
    <!-- 通过实例工厂方法配置bean -->
    <bean id="car2" factory-bean="carFactory" factory-method="getCar">
        <constructor-arg value="audi"></constructor-arg>
    </bean>

FactoryBean
需要继承FactoryBean接口,并具体化接口的三个方法。

public class CarFactoryBean implements FactoryBean {
    private String name;
    public void setName(String name) {
        this.name = name;
    }

    //返回bean对象
    @Override
    public Car getObject() throws Exception {
        // TODO Auto-generated method stub
        return new Car(name,32);
    }
   //返回bean的类型
    @Override
    public Class getObjectType() {
        // TODO Auto-generated method stub
        return Car.class;
    }
    //是否是单实例的
    @Override
    public boolean isSingleton() {
        // TODO Auto-generated method stub
        return true;
    }
}

配置:

<!-- class指向FactoryBean的全类名
    property配置FactoryBean的属性,但实际返回的实例是getObject()方法返回的类型 -->
    <bean id="car3" class="spring.beans.CarFactoryBean">
        <property name="name" value="audi"></property>
    </bean>

通过注解配置Bean

在classpath中扫描组件
组件扫描:Spring能从classpath下自动扫描、侦测和实例化具有特定注解的组件
特定组件包括:@Component 基本注解,标识了一个守Spring管理的组件
@Respository 标识持久层组件
@Service 标识服务层组件
@Controller 标识表现层组件
对扫描到的组件,Spring有默认的命名策略,使用非限定类名,首字母小写,也可以在注解中通过value属性值标识组件

当组件类上使用了特定的注解之后,还需要在Spring的配置文件中声明<context:component-scan>
base-packge属性指定一个需要扫描的基类包,Spring会自动扫描这个包及子类包中的所有类,需要扫描多个包用逗号隔开
resource-pattern仅扫描特定的类而非基包下的所有类
<context:include-filter>子节点表示要包含的目标类,需要配合use-default-filters属性一起使用
<context:exclude-filter>字节点表示要排除的目标类
此两个子节点可以有若干个

@Repository(“name”) 在注解旁可以使用别名name

<context:component-scan>
——元素会自动注册AutowireAnnotationBeanPosiProcessor实例,该实例可以自动装配具有@Autowired、@Resource和@Inject注解的元素

@Autowired
应用于构造器,普通字段,具有参数的方法
若某一属性允许不被设置,可以设置为@Autowired注解的required属性为false
默认情况下IOC容器存在多个类型兼容的Bean,自动装配无法工作,可以在@Qualifier注解里提供选定bean的名称
@Autowired可以应用在数组类型、集合属性、Map上,用在Map上时若键值为String,Spring将自动装配所有于之Map值类型兼容的Bean,此时Bean名称作为键值。

泛型依赖注入
可以为子类自动注入与子类对应的泛型类型的成员变量的引用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值