@Autowired@Resource@Qualifier及其他常⽤注解⼀、@Autowired @Resource @Qualifier区别
ClientService 接⼝
public interface ClientService {
String client();
}
这⾥同时有2个类实现了该接⼝
ClientServiceImpl
@Service("ClientServiceImpl")
public class ClientServiceImpl implements ClientService {
@Autowired
private LoadBalancerClient loadBalancerClient;
@Override
public String client(){
ServiceInstance si = loadBalancerClient.choose("eureka-client");
// 获取Application Service IP。192.168.1.1
System.out.Host());
// 获取Ip及端⼝。192.168.1.1:8081
System.out.InstanceId());
// 获取额外声明信息.{management.port=8081}
System.out.Metadata());
// 端⼝ 8081
System.out.Port());
/
/ 模式 null
System.out.Scheme());
// 应⽤程序名 eureka-client
System.out.ServiceId());
// URI 192.168.1.1:8081
System.out.Uri().toString());
return null;
}
}
ClientServiceImpl2
@Service("ClientServiceImpl2")
public class ClientServiceImpl2 implements ClientService {
@Autowired
private RestTemplate restTemplate;
@Override
public String client(){
ForObject("eureka-client/demo", String.class);
}
}
Controller类
@RestController
public class ClientController {
@Resource(name="ClientServiceImpl2")
private ClientService clientService;
@RequestMapping("/client")
public String client(){
return clientService.client();
}
}
这⾥先解释⼀下这些注解(这些注解可以相互替换) @Controller 定义控制层Bean
@Service 定义业务层Bean
@Repository 定义DAO层Bean
@Component 定义Bean,不确定类型时
这⾥看⼀下这些注解的源码
这⾥解释⼀下什么时类型什么时名字
⼀般@Autowired和@Qualifier⼀起使⽤,@Resource单独⽤。
⼆、@AliasFor注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters ={@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class)})
public @interface SpringBootApplication {
/**
* 排除特定的⾃动配置类,这样它们将永远不会被应⽤。
* ⽐如我们有时候会排除掉数据库的⾃动配置
* @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
*/
@AliasFor(annotation = EnableAutoConfiguration.class)
Class<?>[]exclude()default{};
/**
* 排除特定的⾃动配置类名,这样它们将永远不会被应⽤。
* 例如:
* @SpringBootApplication(excludeName = {"org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration", "org.springframework.boot.auto configure.mail.MailSenderAutoConfiguration"})
*/
@AliasFor(annotation = EnableAutoConfiguration.class)
resource和autowired注解的区别String[]excludeName()default{};
/**
*⽤于扫描带注释组件的基本包。
*/
@AliasFor(annotation = ComponentScan.class, attribute ="basePackages")
String[]scanBasePackages()default{};
/**
* 每个指定类的包将被扫描。
*/
@AliasFor(annotation = ComponentScan.class, attribute ="basePackageClasses")
Class<?>[]scanBasePackageClasses()default{};
/**
* ⽤于处理{@code @SpringBootApplication}注释的扫描器应该
* 使⽤它继承的bean名称⽣成器,例如默认的
* {@link AnnotationBeanNameGenerator}或任何⾃定义实例提供给
* 在引导时的应⽤程序上下⽂。
*/
@AliasFor(annotation = ComponentScan.class, attribute ="nameGenerator")
Class<?extends BeanNameGenerator>nameGenerator()default BeanNameGenerator.class;
/**
* 指定是否应该代理{@link Bean @Bean}⽅法来执⾏
* bean的⽣命周期⾏为,例如返回共享的单例bean实例
* 在⽤户代码中直接调⽤{@code @Bean}⽅法的情况。该功能需要⽅法拦截,通过运⾏时⽣成的CGLIB⼦类实现有⼀些限制,⽐如配置类和它的⽅法不是允许声明{@code final}。
* 默认值是{@code true},允许在配置类,以及外部调⽤该配置的 {@code @Bean}⽅法,例如,从另⼀个配置类。如果不需要的话因为每个特定配置的{@ code @Bean}⽅法都是⾃包含和设计作为⼀个普通的⼯⼚⽅法容器使⽤,开关这个标志为{@code false},以避免CGLIB⼦类处理。
*/
@AliasFor(annotation = Configuration.class)
boolean proxyBeanMethods()default true;
}
@SpringBootApplication并没有定义新的属性⽽是复⽤其他注解已有的注解属性并对其进⾏组合
形成新的注解从⽽到达到便捷的⽬的。这样的注解我们可以称之为复合注解。
所以在使⽤SpringBoot 时我们只需要@SpringBootApplication⼀个注解就能开启
⾃动配置,⾃动扫描的功能。
⽽不再需要使下⾯三个注解来达到同样的⽬的。
@Configuration
@ComponentSan
@EnnableAutoConfiguration
三、@Scope 定义Bean的作⽤域和⽣命过程
@Scope(“prototype”)
prototype解释
singleton单例模式 全局有且仅有⼀个实例
prototype原型模式 – 每次获取Bean的时候会有⼀个新的实例
request request表⽰该针对每⼀次HTTP请求都会产⽣⼀个新的bean,同时该bean仅在当前HTTP request内有效session session作⽤域表⽰该针对每⼀次HTTP请求都会产⽣⼀个新的bean,同时该bean仅在当前HTTP session内有效globalsession global session作⽤域类似于标准的HTTP Session作⽤域,不过它仅仅在基于portlet的web应⽤中才有意义
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论