spring随笔
spring的IOC容器为我们提供了 对象的实例化与属性的赋值,放在对应的配置文件里面,我们只需要获取对应的对象,然后调用对应的方法即可。
<!-- 配置map属性值 -->
<bean id = "newPerson" class= "com.spring.beans.collections.NewPerson2">
<property name="name" value = "Rose"></property>
<property name="age" value = "23"></property>
<property name="mapCar">
<!-- 使用map节点及map的entry子节点配置map类型的成员变量-->
<map>
<entry key = "AA" value-ref="car"></entry>
<entry key = "BB" value-ref="car2"></entry>
</map>
</property>
</bean>
<bean id ="dataSource" class = "com.spring.beans.collections.DataSource">
<!-- 使用props与 prop子节点来为Property赋值-->
<property name="properties">
<props>
<prop key="user">root</prop>
<prop key="password">1234</prop>
<prop key="jdbcUrl">jdbc:mysql:///test</prop>
<prop key="driverClass">com.mysql.jdbc.driverClass</prop>
</props>
</property>
spring提供了一个PropertyPlaceholderConfiger的BeanFactory后置处理器,这个处理器允许用户将Bean配置的部分内容移到属性文件中,可以在Bean配置文件里面使用形式为${var}的变量,PropertyPlaceholderConfigurer从属性文件里加载属性,并使用这些属性才替换变量
Spring还允许在属性文件中使用${proName},以实现属性之前的相互引用.
SpEL 表达式语言,是一个支持运行时查询和操作对象图的强大的表达式语言,使用#{}作为定界符,所有在{}内的字符都被认为是SpEL
</bean>
<!-- 实现BeanPostProcessor接口,并具体提供
两个方法的实现
postProcessBeforeInitialization 在init-method之前被调用
postProcessAfterInitialization 在init-method之后被调用
bean :bean实例本身
beanName:IOC容器配置bean的名字
返回值:是实际上派回给用户的那个bean,注意:可以在以上两个方法中
修改返回的bean,甚至返回一个新的bean
-->
<!-- 配置bean的后置处理器 ,不需要配置id.IOC:容器自动识别是一个beanPostProcessor-->
<bean class = "com.spring.beans.cycle.MyBeansPostProcesser"></bean>
(通过实例其他类来实例化bean)
<!-- 通过静态工厂方法来配置bean,注意不是配置静态工厂方法实例
而是配置bean实例
class 属性:指向静态工厂方法的全类型
factory-method 指向静态工厂方法的名字
constructor-arg:如果工厂方法需要传入参数,则使用
constructor-arg 来配置参数
-->
<bean id = "car1" class = "com.spring.beans.factroy.StaticCarFactory"
factory-method = "getCar">
<constructor-arg value = "audi"></constructor-arg>
</bean>
<!-- 配置工厂的实例 -->
<bean id = "carFactory" class = "com.spring.beans.factroy.InstanceCarFactory">
</bean>
<!-- 通过实例工厂方法 来配置bean-->
<!--
factory-bean 属性 指向实例工厂的方法bean
factory-method 指向静态工厂方法的名字
constructor-arg:如果工厂方法需要传入参数,则使用
constructor-arg 来配置参数
-->
<bean id = "car2" factory-bean="carFactory"
factory-method="getCar" >
<constructor-arg value = "ford"></constructor-arg>
</bean>
<!-- 指定spring IOC容器扫描包 -->
<!-- 可以通过 resource-pattern指定扫描的资源-->
<context:component-scan base-package="com.pring.beans.annotions"
resource-pattern="repository/*.calss"></context:component-scan>子包一起扫描了
<!-- 指定spring IOC容器扫描包 -->
<!-- 可以通过 resource-pattern指定扫描的资源-->
<!-- <context:component-scan base-package="com.pring.beans.annotions"
resource-pattern="repository/*.calss"
></context:component-scan>
-->
<!--context:exclude-filter 子节点指定排除那些指定表达式的组件 -->
<!--context:include-filter 子节点指定包含哪些表达式的组件,
该子节点需要配合use-default-filters配合使用
-->
<context:component-scan base-package="com.pring.beans.annotions"
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:exclude-filter type="assignable" expression="com.pring.beans.annotions.repository.UserRepository"/>
-->
<!-- assignable 类名的方式 -->
<context:include-filter type="assignable" expression="com.pring.beans.annotions.repository.UserRepository"/>
</context:component-scan>
SpringAop
1,加入jar包
2,在配置文件中加入aop的命名空间
3,基于注解的方式
(1)在配置文件中加入如下配置:
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
(2)把横切关注点的代码抽象到切面的类中
i,切面首先是一个IOC容器中的bean,即加入@Component注解
ii,切面还需要加入@Aspect注解
(3)在类中声明各种通知
i,声明一个方法
ii,在方法前加入@Before注解
可以用Order命令来限定切面的优先级
@Pointcut("execution( * com.spring.aop.impl.*.*(int, int))")
public void declareJionPointExpression(){} 使用pointCut来声明切入表达式
还可以用xml形式进行配置
<!-- 配置bean -->
<bean id = "arithemeticColculator"
class = "com.spring.aop.impl.xml.ArithmeticCalculatorImp"
></bean>
<!-- 配置切面的bean -->
<bean id = "loggingAspect"
class = "com.spring.aop.impl.xml.LoggingAspect"
></bean>
<bean id = "validate" class = "com.spring.aop.impl.xml.Vlidation">
</bean>
<!--配置aop -->
<aop:config>
<!-- 配置切点表达式 -->
<aop:pointcut expression="execution(* com.spring.aop.impl.xml.*.*(int, int)))" id="pointcut"/>
<!--配置切面及通知 -->
<aop:aspect ref = "loggingAspect" order = "2">
<aop:before method="beforeMethod" pointcut-ref="pointcut"/>
<aop:after method="afterMethod" pointcut-ref="pointcut"/>
</aop:aspect>
<aop:aspect ref = "validate" order = "1">
<aop:before method="validateArgs" pointcut-ref="pointcut"/>
</aop:aspect>
</aop:config>