IoC:控制反转
对象的生命周期管理交给了Spring,对象的属性的注入(DI)也交给Spring来管理。(IoC容器/Spring容器 -> 面向bean编程)
AOP:面向切面编程
在不改变原有代码的基础上,采用代理机制动态在程序运行过程中添加一系列的功能(将公共的功能集中到一起)。
设值注入,这是我们在Spring应用最多且最广的一种依赖注入方式,非常符合我们以前的开发习惯。基于setter方法来实现依赖注入。(setter强烈推荐你别自己写,让工具帮你生成!)
<bean id="testEntity" class="cn.kgc.demo1.TestEntity">
<property name="specialCharacter1" value="1<2">property>
<property name="specialCharacter2">
<value>value>
property>
<property name="innerBean">
<bean class="cn.kgc.demo1.User">
<property name="username" value="小程">property>
bean>
property>
<property name="sportList">
<list>
<value>游泳value>
<value>下棋value>
list>
property>
<property name="array">
<array>
<value>下棋value>
<value>游泳value>
array>
property>
<property name="set">
<set>
<value>唱跳value>
<value>RAPvalue>
set>
property>
<property name="map">
<map>
<entry>
<key>
<value>CNvalue>
key>
<value>中华value>
entry>
map>
property>
<property name="props">
<props>
<prop key="US">美国prop>
props>
property>
<property name="emptyValue" value="">property>
<property name="nullValue">
<null/>
property>
bean>
基于构造方法(带参构造)实现注入!
之前的设值注入使用的是无参构造(默认调用)。
public class UserService {
private String username;
private User user;
private int age;
// 兼容类型的冲突问题 例如:12既可以存储为字符串 也可以存储为数值
// 出现兼容性问题时 它会按照构造参数上的顺序进行赋值
public UserService(User user,String username,int age) {
this.user = user;
this.username = username;
this.age = age;
}
// 多个不同类型参数的构造方法
/*public UserService(User user,String username) {
this.user = user;
this.username = username;
}*/
// 单个参数构造方法
/*public UserService(String username) {
this.username = username;
}*/
public UserService() {
}
public void test() {
System.out.println("用户名为:"+username);
System.out.println("用户年龄为:"+age);
System.out.println("User的用户名为:"+user.getUsername());
}
}
<bean id="userService" class="cn.kgc.demo2.UserService">
<constructor-arg value="12" name="age"/>
<constructor-arg value="小明"/>
<constructor-arg ref="user"/>
bean>
<bean id="user" class="cn.kgc.demo2.User">
<property name="username" value="小明">property>
bean>
[外链图片转存失败(img-GyOeTaG2-1564378699698)(assets/1564365134941.png)]
p命名空间注入它是基于设值注入,写法上简洁一些。
xmlns:p="http://www.springframework.org/schema/p"
<bean id="userService" class="cn.kgc.demo3.UserService" p:username="小明" p:user-ref="user"/>
前置增强
后置增强
异常抛出增强
// 异常抛出增强 当异常出现之后 会执行的增强
public void throwsExceptionMethod(JoinPoint jp,Exception e) {
Signature signature = jp.getSignature();
// 获取方法名
String methodName = signature.getName();
logger.error("<=="+methodName+"方法执行出现异常<==异常信息为:"+e);
}
<aop:after-throwing method="throwsExceptionMethod" throwing="e" pointcut-ref="logPointCut"/>
最终增强
// 最终增强 finally执行内容
public void afterMethod(JoinPoint jp) {
Signature signature = jp.getSignature();
// 获取方法名
String methodName = signature.getName();
logger.error("<=="+methodName+"方法正在执行最终处理内容");
}
<aop:after method="afterMethod" pointcut-ref="logPointCut"/>
环绕增强:上述所有的增强整合
// 环绕增强
public Object aroundMethod(ProceedingJoinPoint jp) {
Signature signature = jp.getSignature();
String methodName = signature.getName();
String argStr = Arrays.toString(jp.getArgs());
// 前置增强
logger.info("==>正在执行"+methodName+"方法==>方法参数为:"+argStr);
// 此返回值要对应上对应的方法的返回值类型
Object returnResult = null;
try {
// 执行目标方法
returnResult = jp.proceed();
// 后置增强
logger.info("<=="+methodName+"方法执行结束<==方法返回值为:"+returnResult);
} catch (Throwable e) {
e.printStackTrace();
// 异常抛出增强
logger.error("<=="+methodName+"方法执行出现异常<==异常信息为:"+e);
}finally {
// 最终增强
logger.error("<=="+methodName+"方法正在执行最终处理内容");
}
return returnResult;
}
<aop:around method="aroundMethod" pointcut-ref="logPointCut"/>
XML(更接近于基础实现) -> XML + 注解 -> 纯注解
以下注解能帮你实现自动生成bean:(IoC)
@Controller 表现层
@Service 业务逻辑层
@Repository 数据访问层
@Component 组件/部件(适合于非三层架构的类) 通用的
以下注解可以实现自动依赖注入:(DI)
@Autowired 适合于对象属性注入 它和Resource都可以实现按照名称和类型来注入(自动查找)。
@Resource 适合于对象属性注入
@Value 适合于普通值注入
@Component //
@Aspect //
public class LoggerIncreseClass {
private Logger logger = Logger.getLogger(LoggerIncreseClass.class);
@Pointcut("execution(* cn.kgc.demo6.UserService.*(..))")
public void pointCut() {};
// 环绕增强
// @Around("execution(* cn.kgc.demo6.UserService.*(..))")
@Around("pointCut()")
public Object aroundMethod(ProceedingJoinPoint jp) {
Signature signature = jp.getSignature();
String methodName = signature.getName();
String argStr = Arrays.toString(jp.getArgs());
// 前置增强
logger.info("==>正在执行"+methodName+"方法==>方法参数为:"+argStr);
// 此返回值要对应上对应的方法的返回值类型
Object returnResult = null;
try {
// 执行目标方法
returnResult = jp.proceed();
// 后置增强
logger.info("<=="+methodName+"方法执行结束<==方法返回值为:"+returnResult);
} catch (Throwable e) {
e.printStackTrace();
// 异常抛出增强
logger.error("<=="+methodName+"方法执行出现异常<==异常信息为:"+e);
}finally {
// 最终增强
logger.error("<=="+methodName+"方法正在执行最终处理内容");
}
return returnResult;
}
}
<aop:aspectj-autoproxy>aop:aspectj-autoproxy>
e e) {
e.printStackTrace();
// 异常抛出增强
logger.error("<=="+methodName+“方法执行出现异常<异常信息为:"+e);
}finally {
// 最终增强
logger.error("<”+methodName+“方法正在执行最终处理内容”);
}
return returnResult;
}
}
```xml