Spring 模式注解
模式注解是一种用于声明在应用中扮演“组件”角色的注解。如 Spring Framework 中的 @Repository 标注在任何类上 ,用
于扮演仓储角色的模式注解。
@Component 作为一种由 Spring 容器托管的通用模式组件,任何被 @Component 标注的组件均为组件扫描的候选对象。凡是被 @Component 元标注的注解标注时,如 @Service ,也被视作组件扫
描的候选对象。
装配方式
@ComponentScan 方式
@ComponentScan(basePackages = "com.dive.in.spring.boot")
public class SpringConfiguration {
...
}
Spring @Enable 模块装配
Spring Framework 3.1 开始支持”@Enable 模块驱动“。所谓“模块”是指具备相同领域的功能组件集合, 组合所形成一个独立
的单元。比如 Web MVC 模块(@EnableWebMvc)、AspectJ代理模块(@EnableAspectJAutoProxy) 等。
自定义 @Enable 模块
HelloWorldConfiguration:
public class HelloWorldConfiguration {
@Bean
public String helloWorld() { // 方法名即 Bean 名称
return "Hello,World 2020";
}
}
HelloWorldImportSelector:
import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;
import com.example.demo.configuration.HelloWorldConfiguration;
public class HelloWorldImportSelector implements ImportSelector{
@Override
public String[] selectImports(AnnotationMetadata arg0) {
// TODO Auto-generated method stub
return new String[]{HelloWorldConfiguration.class.getName()};
}
}
EnableHelloWorld:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Import(HelloWorldImportSelector.class)
public @interface EnableHelloWorld {
}
EnableHelloWorldBootstrap:
@EnableHelloWorld
public class EnableHelloWorldBootstrap {
public static void main(String[] args) {
ConfigurableApplicationContext context = new SpringApplicationBuilder(EnableHelloWorldBootstrap.class)
.web(WebApplicationType.NONE)
.run(args);
// helloWorld Bean 是否存在
String helloWorld =
context.getBean("helloWorld", String.class);
System.out.println("helloWorld Bean : " + helloWorld);
// 关闭上下文
context.close();
}
}
运行结果:
helloWorld Bean : Hello,World 2020
Spring 条件装配
基于配置方式实现 - @Profile
定义一个服务接口CalculateService :
package com.example.demo.service;
public interface CalculateService {
/**
* 从多个整数 sum 求和
* @param values 多个整数
* @return sum 累加值
*/
Integer sum(Integer... values);
}
Java7CalculateService:
package com.example.demo.service;
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Service;
@Profile("Java7")
@Service
public class Java7CalculateService implements CalculateService {
@Override
public Integer sum(Integer... values) {
System.out.println("Java 7 for 循环实现 ");
int sum = 0;
for (int i = 0; i < values.length; i++) {
sum += values[i];
}
return sum;
}
}
Java8CalculateService:
package com.example.demo.service;
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Service;
import java.util.stream.Stream;
@Profile("Java8")
@Service
public class Java8CalculateService implements CalculateService {
@Override
public Integer sum(Integer... values) {
System.out.println("Java 8 Lambda 实现");
int sum = Stream.of(values).reduce(0, Integer::sum);
return sum;
}
}
启动类
@SpringBootApplication(scanBasePackages = "com.example.demo.service")
public class CalculateServiceBootstrap {
public static void main(String[] args) {
ConfigurableApplicationContext context = new SpringApplicationBuilder(CalculateServiceBootstrap.class)
.web(WebApplicationType.NONE)
.profiles("Java8")
.run(args);
// CalculateService Bean 是否存在
CalculateService calculateService = context.getBean(CalculateService.class);
System.out.println("calculateService.sum(1...10) : " +
calculateService.sum(1, 2, 3, 4, 5, 6, 7, 8, 9, 10));
// 关闭上下文
context.close();
}
}
可以根据在context中设置不同的profile装配不同的Bean
来源:CSDN
作者:suxm&
链接:https://blog.csdn.net/xianmingsu/article/details/104279829