Spring注解-(十二)依赖注入的方式

本文最后更新于:June 15, 2022 pm

Spring 是目前主流的 Java Web 开发框架,是 Java 世界最为成功的框架。Spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅仅限于服务器端的开发。从简单性、可测试性和松耦合性角度而言,绝大部分Java应用都可以从Spring中受益。该框架是一个轻量级的开源框架,具有很高的凝聚力和吸引力。Spring 框架不局限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何 Java 应用都可以从 Spring 中受益。Spring 框架还是一个超级粘合平台,除了自己提供功能外,还提供粘合其他技术和框架的能力。

目录

在前面已经说过的注解这里就不再说了,只是记录一下最后一种自定义依赖注入方式的用法。

自定义依赖注入

目标类:

1
2
3
4
5
6
7
8
9
10
11
12
package com.SpringTestAnnotation.TestValue;

/**
* @Author DragonOne
* @Date 2022/6/10 21:56
* @墨水记忆 www.tothefor.com
*/
@Component
public class OrderS {

}

使用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package com.SpringTestAnnotation.TestValue;

import org.springframework.stereotype.Component;

/**
* @Author DragonOne
* @Date 2022/6/10 11:16
* @墨水记忆 www.tothefor.com
*/
@Component
public class Per {

@OurAnno //自定义注解
private OrderS orderS;

public void show(){
System.out.println("Per show "+orderS);
}

}

自定义注解:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package com.SpringTestAnnotation.TestValue;

import java.lang.annotation.*;

/**
* @Author DragonOne
* @Date 2022/6/12 08:08
* @墨水记忆 www.tothefor.com
*/

@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface OurAnno {
}

测试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package com.SpringTestAnnotation;

import com.SpringTestAnnotation.TestValue.Per;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

/**
* @Author DragonOne
* @Date 2022/6/10 11:16
* @墨水记忆 www.tothefor.com
*/
public class TestAnnotation {
public static void main(String[] args) {
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(TestConfig.class);

Per orderS = applicationContext.getBean("per", Per.class);
orderS.show();
}
}

输出结果:

1
Per show null

可以看见,我们自定义的注解并没有生效。那是因为还差一个自定义实现类。

自定义实现类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
package com.SpringTestAnnotation.TestValue;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

import java.lang.reflect.Field;

/**
* @Author DragonOne
* @Date 2022/6/15 12:33
* @墨水记忆 www.tothefor.com
*/
@Component
public class OurBeanPostProcessor implements BeanPostProcessor, ApplicationContextAware {

private ApplicationContext applicationContext;

@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {

Class aClass = bean.getClass();

for (Field declaredField : aClass.getDeclaredFields()) {

if(declaredField.isAnnotationPresent(OurAnno.class)){

declaredField.setAccessible(true);

Object bean1 = applicationContext.getBean(declaredField.getName());

try {
declaredField.set(bean,bean1);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
return bean;
}

@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
}

输出结果:

1
Per show com.SpringTestAnnotation.TestValue.OrderS@77846d2c