IOC(Inversion of Control)控制反转 DI(Dependency Injection)依赖注入
反转资源的获取方向,由spring容器创建对象
配置bean的方式
在xml文件中通过bean结点来配置bean
<bean id="hellowWorld" class="com.pxc.hellow">
</bean>
如果没有指定唯一的id会自动以完整类名作为默认值
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(String[] args) {
//获取容器对象
ApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext.xml");
//通过容器对象来获取配置的 javabean
Person person=(Person)ioc.getBean("person1");
System.out.println(person);
}
}
ApplicationContext类的主要实现类
ClassPathXmlApplicationContext:从类路径下加载配置文件
FileSystemXmlApplicationContext:从文件系统中加载配置文件
WebApplicationContext:专门为WEB应用而准备的,它允许从相对于web根路径中完成初始化工作
获取bean的三种方式
- getBean(String id)(要强转)
- getBean(Class)
- getBean(String id,Class)
给构造器传递参数
<bean id="dog3" class="com.pxc.Dog>
<constructor-arg value="哈士奇 "></constructor-arg>
</bean>
注入属性的细节
如果注入的值具有特殊的字符要用<![CDATA[]]>但是这种方式只能通过value标签注入
引用其他bean
<property name="car" ref="car1"></property> //引用另外一个bean
可以配置级联属性
<bean id="car1" class="com.pxc.Car></bean>
<bean id="persoon1> class="con.pxc.Person>
<property name="name" value="pxc"></property>
<property name="age" value="20"></property>
<property name="car" ref="car1"></property>
<property name="car.price" value="300000"></property>
</bean>
集合属性
通过<list></list>标签来注入
<map>
<entry key="car1" value-ref="car1"></entry>
</map>
spring2.5后依赖注入可以使用p命名空间来简化操作
<bean id="person1" class="com.pxc.Person" p:name="pxc" p:age="20" p:car-ref="cars"></bean>
自动装配(用的比价少)
byType:按照类型自动装配,这种方式不好的地方是如果在IOC容器中存在两个相同属性的bean会报错
byName:按照bean的id名确保唯一
<bean id="person1" class="com.pxc.Person" p:name="pxc" p:age="20" autowire="byType"></bean>
bean之间的关系
Bean的作用域
Spring EL表达式 用的是#
引用其他的bean
<bean id="person1" class="com.pxc.Person">
<properties name="car" value="#{car}"></properties>
</bean>调用方法以及引用对象中的属性
<bean id="person1" class="com.pxc.Person">
<properties name="name" value="pxc"></properties>
<properties name="car" value="#{car}"></properties>
</bean>
<bean id="person2" class="com.pxc.Person">
<properties name="car" value="#{person1.name.toUpperCase()}"></properties>
<properties name="car" value="#{person1.car}"></properties>
</bean>进行运算
<bean id="person1" class="com.pxc.Person">
<properties name="age" value="10"></properties>
</bean>
<bean id="person2" class="com.pxc.Person">
<properties name="age" value="#{person1.age+10}">
</bean>支持正则和三目运算符
bean的生命周期
<bean id="person" class="com.pxc.Person" init-method="a" destroy-method="b">
<properties name="age" value="20"></properties>
</bean>
bean的后置处理器
如果bean没有初始化方法也会执行后置处理器
Bean的配置方式
通过全类名:也就是反射
通过工厂方法:
静态工厂方法:
包含静态工厂方法类
<bean id="dateFormat" class="java.text.DateFormat" factory-method="getDateInstance">
<constructor-arg value="2"></constructor-arg>
</bean>
实例工厂方法:
<bean id="simpleDateFormat" class="java.text.SimpleDateFormat">
<constructor-arg value="yyyy-MM-dd HH:mm:ss"></constructor-arg>
</bean>
<bean id="date" factory-bean="simpleDateFormat" factory-method="parse">
<constructor-arg value="2017-8-8 12:12:12"></constructor-arg>
</bean>
- FactoryBean:
配置一下:
<bean id="person2" class="com.pxc.PersonFactoryBean"></bean>
基于注解方式配置bean
@Component(value="pxc1")
无需指定创建的bean的id值,有默认的命名策略,将类名首字母小写作为默认的id值,如果设置value属性值就是用户指定的id
然后需要在配置文件中告知spring要扫描哪个包,首先得导入context的命名空间,然后做一下配置
<context:component-scan base-package="com.pxc"></context:component-scan>@Respository 标识持久层bean组件
@Serivice标识业务层
@Controller标识控制层
都可以用@Autowired来完成自动装配@Autowired是按照类型进行装配
@Resource是按照名字装配,@Inject和@Autowired一样只不过没有require属性
AOP(切面编程)
-
如果没有aop,将核心业务和普通业务分离使用代理模式
第一步:
第二步:
第三步:
主方法调用:
![Uploading Paste_Image_235358.png . . .]
AOP的作用简单来说就是在执行方法前,中后干一些事情,比如数据库事务的提交,数据的关闭,只要在项目开发前配置完成,程序员便不用再考虑这些,切面编程有两种方式。
AOP的术语:
- 切面(Aspect):横切关注点模块化(抽象),具有相同功能的横切关注点可以抽象成一个切面。(前置日志后后置日志抽象成一个切面)
- 横切关注点。业务处理当中,不同业务的分离点
- 通知(Advice):切面必须要完成的工作
- 目标(Target):被通知的对象(被代理的对象)
- 连接点(JoinPoint)Spring允许加入通知的方法,是横切关注点的另一种表现形式
- 切点(pointcut):AOP通过切点定为到特定的连接点
- 基于AspectJ注解
- 写一个切面类,@Aspect标注
- 共同业务加入到切面。业务共同的方法
3.前置通知,后置通知@Before("execption(public int 完整的方法名)")
后置通知无论执行是否有异常都会执行。 - 需要在spring配置文件中开启aop配置
<aop:aspectj-autoproxy/> - 要加很多@Component注解
切点表达式
*:通配符,所有
..:在方法的参数列表中使用,不限定类型,顺序,个数
在通知方法的内部访问连接点的细节
在通知方法的参数中,加入一个JoinPoint类型的参数
JoinPoint的一些方法:
获取参数列表:jp.getArgs();
获取方法的名称:jp.getSignature().getName();
返回通知
@After注解无论方法返回过程中是否抛出异常都会执行,@AfterReturing必须是返回成功才会执行,加了这个注解后添加一个returning属性可以得到返回值
异常通知 @AfterThrowing
环绕通知(用的少)
切面的优先级
重用切入点
- 基于XML配置
spring对JDBC的支持