@Configuration注解的使用
示例:
public class Student {
private String hight;
public void eat(){
System.out.println("eat...");
}
public void setHight(String hight){
this.hight=hight;
}
public String all(){
System.out.println(hight);
return "abc";
}
}
@Configuration
public class Config {
@Bean(name = "aaa")
public Student student(){
Student student1 = new Student();
student1.setHight("170");
return student1;
}
@Bean(name = "bbb")
public Student student1(){
Student student1 = new Student();
student1.setHight("175");
return student1;
}
}
@Autowired
private Student aaa;
@RequestMapping("student")
@ResponseBody
public String stuent(){
String all = aaa.all();
return all;
}
@Resource(name = "bbb")
private Student student;
@RequestMapping("student1")
@ResponseBody
public String student1(){
String s = student.all();
return s;
}
@Qualifier注解的使用
public class Person {
public void eat(String food){
System.out.println("我是吃货");
}
}
@Qualifier("Asian")
@Component
public class AsianMan extends Person{
@Override
public void eat(String food) {
System.out.println("Asian");
System.out.println("黄种人");
System.out.println(food);
}
}
@Qualifier("Europe")
@Component
public class EuropeMan extends Person {
@Override
public void eat(String food) {
System.out.println("Europe");
System.out.println(food);
}
}
@Autowired
@Qualifier("Asian")
private Person person;
@RequestMapping("Asian")
@ResponseBody
public String Asian(){
person.eat("大米");
return null;
}
访问:http://localhost:8080/Asian
Spring AOP简单介绍
AOP面向界面编程,提供了一种思路来解决应用系统中的一些公共服务。如:
- 业务方法中的一些权限管理。
- 每个方法调用的审计。
- 数据库事务的管理。
- 缓存。
没有AOP之前,需要在每个方法中实现。有了AOP,可以在运行时刻动态的“织入”一些公共代码。
常见AOP术语:
-
Aspect:类似于Java中的类声明,在Aspect中会包含一些Pointcut及相应的Advice。
-
Joint point:程序中定义的点,典型的如方法调用,参数访问,异常处理程序块的执行。Spring中只支持方法调用。
-
Pointcut:表示一组Joint point,如方法名、参数类型、返回类型等,这些Joint point通过逻辑关系组合起来,它定义了Advice将要发生的地方。
-
Advice:Advice定了在Pointcut里面具体要执行的操作,通过before、around、after(return、throw、finally)来区别是在每个Joint point 之前、之后、或是之前之后执行。
- before:在执行方法前调用Advic,如缓存。
- around:在执行方法前后调用Advice,最常用的一种。
- after:在执行方法后调用Advice,after return 是方法正常返回后调用,after throw是方法抛出异常后调用。
- finally:方法调用后执行Advice,无论是否异常都执行。
-
AOP proxy:AOP proxy也是Java对象,由AOP框架来创建,完成以上动作,AOP对象通常可以通过JDK dynamic proxy完成,或CGLib完成。
-
Weaving:实现上述切面编程的代码织入,可以在编译时刻(通过AspectJ compiler),也可以在运行时刻,Spring和其他大多数框架都是在运行时刻。
实例:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
@Configuration
@Aspect //声明是一个切面
public class AOPConfig {
@Around("@within(org.springframework.stereotype.Controller)")
//要织入的代码
public Object simpleAop(final ProceedingJoinPoint pjp) throws Throwable {
//将调用方法的参数取出来
Object[] args = pjp.getArgs();
System.out.println("args:"+ Arrays.asList(args));
System.out.println("aop");
//调用原有方法,必须调用,不然原有方法不执行
Object o = pjp.proceed();
System.out.println(o);
return o;
}
}
@Autowired
private Student aaa;
@RequestMapping("student")
@ResponseBody
public String stuent(String name){
String all = aaa.all();
return "a";
}
访问:http://localhost:8080/student?name=cc控制塔打印如下:
maven中scope的理解:
scope:scope代表此类库与项目的关系,默认是compile,也就是编译和打包都需要此类库。test表示仅仅在单元测试的时候需要;provided表示在编译阶段需要此类库,但打包阶段不需要,这是因为项目的目标环境已经提供了;runtime表示在编译和打包的时候都不需要,但在运行的时候需要,比如某个指定的数据库驱动,编译和打包都不需要,但测试应用的要连接数据库的时候就需要此数据库驱动。