spring学习第三天

-----------------------------------Spring–SpEL------------------------------------------

Spring 表达式语言(简称SpEL):是一个支持运行时查询和操作对象的强大表达式语言。

语法类似于EL:SpEL使用#{…}作为定界符,所有在大框号中的字符都被认为是SpEL
SpEL为bean的属性进行动态赋值提供了便利。
通过SpEL可以实现:
通过bean的id对bean进行引用
调用方法以及引用对象中的属性
计算表达式的值
正则表达式的匹配
字面量
整数:#{5}
小数:#{89.2}
科学计数法:#{1e4}

Spring可以使用单引号或双引号作为字符串的定界符号
#{“Chuck”}
#{‘Chuck’}
#{fslse}
SpEL:引用Bean,属性和方法(1)
引用其他对象:
通过value属性和SpEL配置Bean之间的应用关系

<property name="prefix" value="#{prefixGenerator}"></property>

引用其他对象的属性:
通过value属性和SpEL 配置suffix 属性值为另一个Bean的suffix属性值

<property name="suffix" value="#{sequenceGenerator2.suffix}">

调用其他方法,还可以链式操作
通过value属性和SpEL配置suffix,返回值为另一个Bean的方法的返回值

<property name="suffix" value="#{sequenceGenerator2.toString()}">

方法的连接

<property name="suffix" value="#sequenceGenerator2.toString().toUpperCase()">

SpEL支持算数运算符:+,-,*,/,%,^

加号还可以用作字符连接:
比较运算符:<,>,==,<=,>=,lt,gt,eg,le,ge
逻辑运算符:and,or,not,|
if-else运算符:?(temary),?(Elvis)
if-else的变体
正则表达式:matches

调用静态方法或静态属性:通过T()调用一个类的静态方法,它将返回一个Class Object,然后再调用相应的方法或属性:

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

------------------------Spring–管理Bean的生命周期--------------------------------
******Spring IOC容器可以管理Bean的生命周期,Spring允许在Bean的生命周期的特定点执行定制任务。

SpringIOC容对Bean的生命周期进行管理的过程:
  • 通过构造器和工厂方法构造Bean实例
  • 为Bean的属性值和对其他Bean的引用
  • 调用Bean的初始化方法
  • Bean可以使用了
  • 当容器关闭,调用Bean的销毁方法
    在Bean的声明里设置init-method和destory-method属性,为Bean指定初始化和销毁方法。
创建Bean后置处理器
  • Bean后置处理器允许在调用初始化方法前后对Bean进行额外的处理。
  • Bean后置处理器对IOC容器里所有的Bean实例逐一处理,而非单一实例,其典型应用是:检查Bean属性正确性或根据特定的标准改造Bean的属性。
  • 对Bean后置处理器而言,需要实现interface BeanPostProcessor接口,在初始化方法被调用前后,Spring将把某个Bean实例分别传递给上述一下两个方法:
    postPrecessAfterInitialixation(Obejct bean,String beanName);
    postPrecessBefereInitialixation(Object bean,String beanName);
添加Bean 的生命周处理器进行管理的过程:
  • 通过构造器和工厂方法构造Bean实例
  • 为Bean属性这只值和其他Bean的引用
  • 为Bean的实例传送给Bean的后置处理器的postProcessBeforeInitialization方法
  • 调用Bean的初始化
  • 将Bean实例传送给Bean后置处理器postProcessAfterInitialization方法
  • 调用Bean的初始化方法
  • Bean可以使用了
  • 当容器关闭,调用Bean的销毁方法

------------------------Spring–通过工厂方法配置Bean------------------------

通过静态工厂方法创建Bean
  • 调用静态工厂方法创建Bean是将对象创建的过程封装到静态方法中,当客户端需要对象,只需要简单地调用静态方法,而不同关心创建对象的细节。
  • 要声明通过静态方法创建Bean,需要在Bean的class属性里指定拥有工厂方法的类,同时在factory-method属性里指定工厂的名称。最后使用元素为该方法传递方法参数。
<!--通过静态工厂方法来配置Bean,注意不是配置静态工厂方法实例,而是配置Bean实例-->
<!--class属性:指向静态工厂方法的全类名
factory-method:指向静态工厂方法的名字
constructor-arg:如果工厂方法需要传入参数,则使用constructor-arg配置参数。
    -->
<bean id="car1" class="org.example.factory.StaticCarFactory" factory-method="getCar">
    <constructor-arg value="audi"></constructor-arg>
</bean>
通过调用实例工厂方法创建Bean
  • 实例工厂方法:将对象的创建过程封装到另外一个对象实例的方法里,当客户端需要请求对象时,只需要简单的调用该实例方法而不需要关心对象的创建细节。
要声明通过工厂方法创建Bean
  • 在bean的factory-bean属性里指定拥有该工厂方法的Bean
  • 在factory-method属性里指定该工厂方法的名称。
  • 使用constructor-arg元素为工厂方法传递方法参数。
<!--配置工厂的实例-->
<bean id="carFactory" class="org.example.factory.InstanceCarFactory"></bean>

<!--通过实例工厂的方法来配置Bean
factory-bean:指向实例工厂方法的bean
 factory-method:指向静态工厂方法的名字
constructor-arg:如果工厂方法需要传入参数,则使用constructor-arg配置参数。-->
<bean id="car2" factory-bean="carFactory" factory-method="getCar">
<constructor-arg value="fute"></constructor-arg></bean>

------------------Spring–通过FactoryBean配置Bean-----------------------------

package org.example.FactoryBean;

import org.springframework.beans.factory.FactoryBean;
//自定义的FactoryBean 需要实现FactoryBean 接口
public class CarFactoryBean implements FactoryBean<Car> {
    private String brand;
    public void setBrand(String brand){
        this.brand=brand;
    }
    //返回Bean的对象
    @Override
    public Car getObject() throws Exception {
        return new Car(brand,50000);
    }
    /**
     * 返回Bean的类型
     * @return
     */
    @Override
    public Class<?> getObjectType() {
        return Car.class;
    }

    /**
     *
     * @return
     */
    @Override
    public boolean isSingleton() {
        return false;
    }
}
<?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="car" class="org.example.FactoryBean.CarFactoryBean">
    <!--通过FactoryBean来配置bean的实例
    class:指向FactoryBean 的全类名
    property:配置FactoryBean的属性但实际返回的实例确实FactoryBean的getObject()方法返回的实例!-->
   <property name="brand" value="BMW"></property>
</bean>
</beans>

----------------------Spring–通过注解配置Bean1-----------------------------------

在classpath中扫描组件

组件扫描(component scanning ):Spring 能够从classpath下自动扫描,侦测和实例化具有特定注解的组件。
特定组件包括:
-@Component:基本注解,标识了一个受Spring管理的组件
-@Respository:标识持久层组件
-@Service:标识服务层(业务层)组件
-@Controller:标识表现层组件 UserService userService
对于扫描到的组件,Spring有默认的命名策略:使用非限定类名,第一个字母小写,也可以在注解中通过value属性值标识组件的名称。
当在组件类上使用了特定的注解之后,还需要在Spring的配置文件中声明context:component-scan:
-bean-package属性指定一个需要扫描的基类包,Spring容器将会扫描这个基类包里及其子包中的所有类。
-当需要扫描多个包时,可以使用逗号分隔。
-如果仅希望扫描特定的类而非基包下的所有类,可使用resource-pattern属性过滤特定的类。

<context:component-scan
   base-package="com.atguigu.spring.beans"
   resource-pattern="autowire/*.class"/>

-context:include-filter子节点表示要包含的目标类
-context:exclude-filter子节点表示要排除在外的目标类
-context:component-scan下可以拥有若干个context:include-filter和context:exclude-filter子节点。

在classpath中扫描组件
context:include-filter和context:exclude-filter子节点支持多种类型的过滤表达式。
annotation:
assinable:

<!--指定spring IOC 容器扫描的包-->
<!--可以通过resource-pattern指定扫描的资源-->
<context:component-scan base-package="org.example.annotation"></context:component-scan>
    <!-- <context:component-scan base-package="org.example.annotation"
resource-pattern="repository/*.class">-->
<!--context:exclude-filter:排斥那些指定表达式的组件需要和-context:exclude-filter:配合使用-->
<!--context:exclude-filter:只包含那些指定的表达式组件
use-default-filters="false":默认为包含所有的组件。-->
<context:component-scan base-package="org.example.annotation"
                        resource-pattern="repository/*.class"
                        use-default-filters="false">
    <!--
    <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>-->
   <!-- <context:include-filter type="annotation" expression="org.springframework.stereotype.Repository"/>-->
    <context:include-filter type="assignable" expression="org.example.annotation.repository.UserRepository"/>

--------------------------Spring–通过注解配置Bean2-------------------------------
组件装配
context:component-scan元素还会自动注册
AutowireAnnotationBeanPostProcessor实例,该实例可以自动装配具有@Autowire 和@Resource,@Inject 注解的属性

@Autowired自动装配
@Autowire注解自动装配具有兼容类型的单个Bean属性
-构造器,普通字段(即使是非public),一切具有参数的方法都可以应用@Autowired注解
-默认情况下,所有使用@Autowired注解的属性都需要被设置,当Spring找不到匹配的Bean属性时,会抛出异常,若某一属性允许不被设置,可以设置@Autowire注解的required属性为false。
-默认情况下,当IOC容器在存在多个类型兼容的Bean兼容时,通过类型的自动装配将无法工作,此时可以在@Qualifier注解里提供Bean的名称,Spring允许对方法的入参标注@Qualifiter已指定注入的Bean的名称。
-Autowired 注解也可以应用在集合属性上,此时Spring读取该集合的类型信息,然后自动装配所有与之兼容的Bean。
-Autowired注解用在java.util.Map上时,若该Map的键值为String,那么将自定装配与之Map值类型兼容的Bean,此时Bean的名称为键值。
-------------------------------Spring–泛型依赖注入-----------------------------------
Spring 4.X 中可以为子类注入子类对应的泛型类型的成员变量的引用
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值