导入Spring使用的maven依赖:
junit
junit
4.12
org.springframework
spring-webmvc
5.2.2.RELEASE
applicationContext.xml (beans.xml):
假设我们使用Spring的IOC创建对象,默认创建的bean对象是用 无参方式 方式创建对象,如果我们要使用有参构造对象,那么请务必保证我们的对象是有 有参构造函数 的类,同时如果要用set方式注入的话也要保证我们所创建的对象的类的各个参数是有 Set 方法的类!!!
bean的配置:
有参构造创建对象方法:
自动装配
xml中实现自动装配:
使用注解实现自动装配:
要使用注解须知:
- 导入约束 context约束
- 配置注解的支持:
@Autowired
直接在属性上用即可!也可以在set方式上使用!
使用Autowired我们可以不用使用Set方法了,前提是你这个自动装配的属性在IOC(Spring)容器中存在且符合名字(ByName)
测试代码**:
public class People {
//如果显式的定义了AutoWired的required属性为false,说明这个对象可以为null,否则不允许为空
@Autowired(required = false)
@Qualifier(value = "cat111")
private Cat cat;
@Autowired
private Dog dog;
private String name;
}
如果@Autowired自动装配的环境比较复杂,自动装配无法通过一个注解【@Autowired】完成的时候、我们可以使用@Qualifier(value = "xxx")去配合@Autowired的使用,指定一个唯一的bean对象注入
@Resource注解
在java1.8以后使用这个java的原生注解需要加入依赖的jar包:
javax.annotation
javax.annotation-api
1.3.2
使用:
public class people
{ @Resource(name="cat")
private Cat cat;
@Resource
private Dog dog;
}
小结:
@Autowired是属于spring的注解,它所在的包org.springframework.beans.factory.annotation,它是按byType注入的,默认是要依赖的对象必须存在,看源码就可以理解,boolean required() default true;可以看到默认值是true,如果需要允许依赖对象是null,那就@Autowired(required=false)就可以了。
如果我们想@Autowired按名称装配,可以结合@Qualifier注解一起使用
@Autowired
@Qualifier("user")
private User user;
@Resource默认通过byname的方式实现,如果找不到名字,则通过byType实现!如果两个都找 不到的情况下,就报错!
执行顺序不同:@Autowired默认通过byType的方式实现 @Resource默认通过byname 的方式实现
使用注解开发 [重点]
在Spring4之后,要使用注解开发,必须要保证AOP包已经导入了 [此包已经包含在了spring-webmvc的包里面了]
使用注解需要导入context约束,增加注解的支持!,并且开启注解的支持
bean属性如何注入:
//两种方法都行,在属性和set方法上都可以使用注解进行属性注入
@Component public class User {
//相当于
@Value("kuangshen")
public String name;
//相当于
@Value("kuangshen")
public void setName(String name)
{
this.name = name;
}
}
衍生的注解 :
@Component有几个衍生注解,我们在web开发中,会按照mvc三层架构分层!
dao 【@Repository】
service 【@Service】
controller 【@Controller】
这四个注解功能都是一样的,都是代表将某个类注册到Spring中,装配Bean
自动装配:
@Autowired:自动装配通过类型、名字
如果Autowired不能唯一自动装配上属性,则需要通过@Qualifier(value="xxx")
@Nullable:字段标记了这个注解,说明这个字段可以为null
@Resource:自动装配通过名字、类型
@Component:自动装配通过名字、类型
作用域:
@Component
@Scope("prototype")
public class User {
//相当于
@Value("尹锐")
public String name;
}
小结:
我们在使用的过程中,只需要注意一个问题:必须让注解生效,就需要开启注解的支持
使用Java的方式配置Spring (略)
AOP
横切关注点、切面(ASPECT)、切入点(PointCut)
SpringAOP中,通过Advice定义横切逻辑,Spring中支持5种类型的Advice:
- 前置通知
- 后置通知
- 环绕通知
- 异常抛出通知
- 引介通知
即 Aop 在 不改变原有代码的情况下 , 去增加新的功能 .
使用Spring实现AOP
【重点】使用AOP织入,需要导入一个依赖包!
org.aspectj
aspectjweaver
1.9.4
在applicationContext.xml中加入对aop支持的头文件(命名空间)
方式一:使用Spring的API接口【主要SpringAPI接口实现】 :
方式二:自定义类来实现AOP【主要是切面的定义】
方式三:使用注解实现!
package com.kuang.diy;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
/**
* @author yuqiliu
* @create 2020-01-03 22:03
*/
//方式三:使用注解方式实现AOP
@Aspect //标注这个类是一个切面
public class AnnotationPointCut {
@Before("execution(* com.kuang.service.UserServiceImpl.*(..))")
public void before()
{
System.out.println("===========方法执行前==========");
}
@After("execution(* com.kuang.service.UserServiceImpl.*(..))")
public void after()
{
System.out.println("===========方法执行后==========");
}
//在环绕增强中,我们可以给定一个参数,代表我们要获取处理切入的点:
@Around("execution(* com.kuang.service.UserServiceImpl.*(..))")
public void around(ProceedingJoinPoint jp) throws Throwable {
System.out.println("环绕前");
//执行方法
Object proceed=jp.proceed();
System.out.println("环绕后");
Signature signature = jp.getSignature();//获得签名
System.out.println("signature:"+signature);
System.out.println(proceed);
}
}
applicationContext.xml: