类型
赞
踩
使用无参构造(默认)
使用有参构造
参数名
<beans>
<bean id="beanOne" class="x.y.ThingOne">
<constructor-arg ref="beanTwo"/>
<constructor-arg ref="beanThree"/>
</bean>
</beans>
类型
<!--多个同类属性无法识别,不建议-->
<beans>
<bean id="beanOne" class="x.y.ThingOne">
<constructor-arg type="java.lang.Integer" value="12"/>
<constructor-arg type="java.lang.String" value="BeanName"/>
</bean>
</beans>
下标
<beans>
<bean id="beanOne" class="x.y.ThingOne">
<constructor-arg index="0" value="12"/>
<constructor-arg index="1" value="BeanName"/>
</bean>
</beans>
在配置文件加载的时候对象就已经创建了,且容器默认单例。
别名
<!--可以使用subsystemA获取myApp对应的对象-->
<alias name="myApp" alias="subsystemA"/>
Bean的配置
import
<!--一般用于团队开发,将多个配置导入合并为一个-->
<import resource="beans.xml"/>
见上文…
<!-- 可以注入的内容 bean | ref | idref | list | set | map | props | value | null--> <!--注入字符串--> <property name="name" value="name"/> <!--注入引用--> <property name="address" ref="address"/> <!--注入数组--> <property name="someMap"> <array> <value>12</value> <value>25</value> </array> </property> <!--注入list--> <property name="hobbies"> <list> <value>写作业</value> <value>学习</value> </list> </property> <!--注入map--> <property name="card"> <map> <entry key="an entry" value="just some string"/> <entry key ="a ref" value-ref="myDataSource"/> </map> </property> <!--注入set--> <property name="games"> <set> <value>LOL</value> <value>EVO</value> </set> </property> <!--注入null--> <property name="games"> <null/> </property> <!--注入null--> <property name="info"> <props> <prop key="学号" >20152351</prop> <prop key="url" >http://url.xiaoming.cn</prop> </props> </property>
导入p或c命名空间的约束
<!-- p -->
<beans xmlns:p="http://www.springframework.org/schema/p">
</beans>
<!-- c -->
<beans xmlns:c="http://www.springframework.org/schema/c">
</beans>
p命名空间
property:可以直接注入属性值,对应set注入
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean name="classic" class="com.example.ExampleBean">
<property name="email" value="someone@somewhere.com"/>
</bean>
<bean name="p-namespace" class="com.example.ExampleBean"
p:email="someone@somewhere.com"/>
</beans>
c命名空间
对应构造器注入
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:c="http://www.springframework.org/schema/c" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="beanTwo" class="x.y.ThingTwo"/> <bean id="beanThree" class="x.y.ThingThree"/> <!-- traditional declaration with optional argument names --> <bean id="beanOne" class="x.y.ThingOne"> <constructor-arg name="thingTwo" ref="beanTwo"/> <constructor-arg name="thingThree" ref="beanThree"/> <constructor-arg name="email" value="something@somewhere.com"/> </bean> <!-- c-namespace declaration with argument names --> <bean id="beanOne" class="x.y.ThingOne" c:thingTwo-ref="beanTwo" c:thingThree-ref="beanThree" c:email="something@somewhere.com"/> </beans>
自动装配是spring满足Bean依赖的一种方式
spring会在上下文中自动寻找,并自动给Bean装配属性
spring中的三种配置方式:
<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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<!--按照id找set方法后面的名字-->
<bean id="beanOne" class="x.y.ThingOne" autowire="byName"/>
<!--但是type必须唯一 -->
<bean id="beanOne" class="x.y.ThingOne" autowire="byType"/>
</beans>
byName:需要保证所有的bean的id唯一,并且Bean需要和自动注入的属性的set方法的值一致
byType:需要保证所有的bean的类型唯一,并且Bean需要和自动注入的属性的类型一致
jdk1.5支持,spring2.5以后支持注解
使用注解需要:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<context:annotation-config/>
</beans>
在spring4之后,必须要保证AOP的包已经导入,才可以使用
使用注解需要增加context依赖
<!--扫描包-->
<context:component-scan base-package="cn.yu.beans"/>
<context:annotation-config />
在web开发中,我们会按照mvc架构进行分层,dao\controller\service等,@component有这些衍生注解
他们的功能都是一样的,把类交给Spring来进行管理,在spring中进行注册,装配Bean
第三节
<!-- 具体看2.4 -->
<bean id="myCommand" class="fiona.apple.AsyncCommand" scope="prototype">
<!-- scope的值有singleton(单例模式)、prototype(原型模式)、request、session、application、websocket-->
</bean>
@Scope("prototype")
public class Bean{
//属性和方法
}
4.6、对比
建议(不是我说的):xml来管理bean,注解只负责完成属性的注入,在开发中要注意必须让注解生效
JavaConfig之前是spring的子项目,在spring4之后变成了核心功能,完全不需要配置文件,交给Java文件来实现。获取对象时候需要使用AnnotationConfigApplicationContext
public class User{
private String name;
//get set toString等
}
@Configuration
//configration也会被spring容器托管
@ComponentScan("")
//扫描包
@import("xxx.class")
//引入配置文件,类似xml的引入
public class myConfig{//任意命名
@Bean
public User getUserBean(){
return newUser();
}
}
spring实现AOP底层就是代理模式,代理模式可以使真实角色的业务操作更加纯粹,不用去关注公共业务,实现了业务的分工,在公共业务发生扩展的时候方便集中管理,但一个角色会有一个代理,代码量翻倍,开发效率变低(解决方案动态代理)。
静态代理
动态代理-反射实现
Proxy-代理:提供了创建动态代理类和实例的静态方法,它也是由这些方法创建的所有动态代理类的超类
InvocationHandler(调用处理程序):每个代理实例都有一个关联的调用处理程序。 当在代理实例上调用方法时,方法调用将被编码并分派到其调用处理程序的invoke方法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HRLn3Myy-1617276189564)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20210330110400079.png)]
InvocationHandler handler = new MyInvocationHandler(...);
Class<?> proxyClass = Proxy.getProxyClass(Foo.class.getClassLoader(),Foo.class);
Foo f = (Foo) proxyClass.getConstructor(InvocationHandler.class).newInstance(handler);
//方法二
Foo f = (Foo) Proxy.newProxyInstance(Foo.class.getClassLoader(),new Class<?>[] {Foo.class},handler);
AOP(Aspect Oriented Programming)意为面向切面编程,是一种通过预编译方式和运行时期动态代理实现程序功能的同意维护的技术.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BQhTWIi0-1617276189573)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20210330154655808.png)]
AOP在Spring中的作用:提供声明式事务;允许用户自定义切面
前置(方法前),后置(方法后),环绕(方法前后),异常(方法抛出异常),引介(方法增加属性)
实现接口
在XML文件中配置AOP
<!--记得导入约束xmlns:aop-->
<aop:config>
<!--id切入点命名 expression表达式 -->
<aop:pointcut id="pointcut" expression="execution( * cn.yu.beans.*(..) )"/>
<!--通知-->
<aop:advisor advice-ref="log" pointcut-ref="point"/>
<aop:advisor advice-ref="afterLog" pointcut-ref="point"/>
</aop:configa>
<!--记得导入约束xmlns:aop-->
<aop:config>
<!--id切入点命名 expression表达式 -->
<aop:aspect ref="bean">
<!--切入点-->
<aop:pointcut id="pointcut" expression="execution( * cn.yu.beans.*(..) )"/>
<!--通知-->
<aop:before method="before" pointcut-ref="point"/>
<aop:after method="after" pointcut-ref="point"/>
</aop:aspect>
</aop:configa>
@Aspect //标记切面
public class AnnotationProxy{
//方法执行前
@Before("exection(* com.yu.bean.*(..))")
public void before(){
System.out.println("....");
}
}
<!--开启注解支持-->
<aop:aspectj-autoproxy proxy-target-class="true"/>
<!--默认为false,修改为true之后使用cglib代理-->
配置声明式事务
<bean id="transactionManager" class="org.springframework.jdbc.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <!--结合AOP进行事务织入--> <tx:advice id="txadvice" transaction-manager="transactionManager"> <!--结合AOP进行事务织入--> <tx:attributes> <!--事务传播方式,共七种,默认REQUIRED--> <tx:methods name="*" propagation="REQUIRED"/> <tx:methods name="search" read-only="true"/> </tx:attributes> </tx:advice> <aop:config> <aop:pointcut id="txPoint" expression="execution( * cn.yu.beans.*(..) )"/> <aop:advisor advice-ref="txAdvice" pointcut-ref="txPoint"/> </aop:config>
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。