注解的好处:如果管理很多的Bean,要求这些Bean都配置在applocationContext.xml文件中。用了注解之后,就不需要在xml文件中配置了,Spring提供了几个辅助类会自动扫描和装配这些Bean。所以大大减少了xml文件的体积,Spring会根据配置去扫描某些包里面的类,得到类的方法或注解,不同的注解会进行不同的操作。

@Configuration

这个注解一般的来说,用在类上面,加上这个注解的类可以成为一个spring的xml配置文件,使用的是java代码的配置

//配置Spring装载类
//Configurable 指定此类为Spring配置类。作为配置类,替代XML配置文件
//ComponentScan 指定Bean范围(注解范围),扫描装载
@Configurable
@ComponentScan(basePackages = {"com.minelsh"})
public class springConfig {
}

创建对象的注解

Spring中作用在作用类上的注解有@Component注解和三个衍生注解:@Responsity  @Service和@Controller
三个衍生注解的说明:

@Controller:通常用于Controller类,也就是控制层(MVC)。

@Service:通常用于Service类,也就是服务层。

@Repository:通常用于DAO类,也就是持久层。

当注解在作用类上时,表明这些类似交给Spring容器进行管理的。

@Component注解的使用

@Component("conversionImpl")
//其实默认的spring中的Bean id 为 conversionImpl(首字母小写)
public class ConversionImpl implements Conversion {

}

案例1:

不指定bean的名称,默认为类名首写小写字母

@Component
public class University {
to do sthing...
}

获取bean方式:

ApplicationContext ctx  = new
ApplicationContext context = new AnnotationConfigApplicationContext(Bean配置类);
University ust = (University) ctx.getBean("university");

案列2:

指定bean的名称

@Component("university1")
public class University {
to do sthing...
}

获取bean方式:

ApplicationContext ctx  = new
ApplicationContext context = new AnnotationConfigApplicationContext(Bean配置类);
University ust = (University) ctx.getBean("university1");

在构造器上的注解

@Autowired  :根据类型(ByType)来自动匹配(核心注解)

这个注解可以用于属性,setter方法,还有构造器上,这个注解用于注入依赖的对象。当再一个属性上加上@Autowired注解,有时可能要指定一些额外的值,Spring然后会自动的将值赋给这个属性。

案例1:作用在构造器上

public class MovieRecommender {
private final CustomerPreferenceDao customerPreferenceDao;
@Autowired
public MovieRecommender(CustomerPreferenceDao customerPreferenceDao) {
this.customerPreferenceDao = customerPreferenceDao;
}
// ...
}

案列2:使用在setter方法上

public class SimpleMovieLister {
private MovieFinder movieFinder;
@Autowired
public void setMovieFinder(MovieFinder movieFinder) {
this.movieFinder = movieFinder;
}
// ...
}

案列3:使用在域属性上

public class MovieRecommender {
private final CustomerPreferenceDao customerPreferenceDao;
@Autowired
private MovieCatalog movieCatalog;
@Autowired
public MovieRecommender(CustomerPreferenceDao customerPreferenceDao) {
this.customerPreferenceDao = customerPreferenceDao;
}
// ...
}

案列4:使用在任意方法名和产生的普通方法上

public class MovieRecommender {
private MovieCatalog movieCatalog;
private CustomerPreferenceDao customerPreferenceDao;
@Autowired
public void prepare(MovieCatalog movieCatalog,
CustomerPreferenceDao customerPreferenceDao) {
this.movieCatalog = movieCatalog;
this.customerPreferenceDao = customerPreferenceDao;
}
// ...
}

案列5:使用在域属性数组上

public class MovieRecommender {
@Autowired
private MovieCatalog[] movieCatalogs;
// ...
}

案列6:使用在集合类型上

public class MovieRecommender {
private Set<MovieCatalog> movieCatalogs;
@Autowired
public void setMovieCatalogs(Set<MovieCatalog> movieCatalogs) {
this.movieCatalogs = movieCatalogs;
}
// ...
}

@Qualifier

这个注解和@Autowired一起使用,当想对注入的过程做更多的控制,@Qualifier可以帮助指定做更详细的配置。一般在两个或多个bean是相同的类型,spring在注入的时候会出现混乱

例如有个接口叫做Hellointerface,然后两个bean都实现了Hellointerface接口

@Component
public class Bean1 implements HelloInterface {
//
}

@Component
public class Bean2 implements HelloInterface {
//
}

如果只使用@Autowired注解,Spring就不知道到底要注入哪一个bean。解决办法就是加上@Qualifier注解

@Component
public class BeanA {

@Autowired
@Qualifier("bean2")
private HelloInterface dependency;
...

@Resource:根据类型和名称(ByType & ByName)来自动匹配(核心注解)

@Resource和@Autowired注解都是用来实现依赖注入的。只是@AutoWried按by type自动注入,而@Resource默认按byName自动注入。

@Resource有两个重要属性,分别是name和type
spring将name属性解析为bean的名字,而type属性则被解析为bean的类型。所以如果使用name属性,这使用ByName的自动注入策略,如果使用Type类型则使用ByTyoe的自动注入策略。如果都没有指定,则听过反射机制使用ByName自动注入策略。

案列1:使用@Resource注解

@Resource(name="bucket")
private String bucketName;
@Resource(name="style")
private String styleName;

翻译为xml模式来看

<bean name="bucket" class="java.lang.String">
<constructor-arg value="${oos.bucketName}"/>
</bean> <bean name="style" class="java.lang.String">
<constructor-arg value="${oos.styleName}"/>
</bean>

Spring完全注解开发的更多相关文章

  1. Spring _day02_IoC注解开发入门

    1.Spring IoC注解开发入门 1.1 注解开发案例: 创建项目所需要的jar,四个基本的包(beans core context expression ),以及两个日志记录的包,还要AOP的包 ...

  2. spring原始注解开发-01

    我们使用xml-Bean标签的配置方式和注解做对比理解 1.创建UserDao接口以及UserDao的实现类UserDaoImpl(接口代码省略) public class UserDaoImpl i ...

  3. Spring使用注解开发及使用java类进行配置bean

    Spring使用注解开发 说明 在spring4之后,想要使用注解形式,必须得要引入aop的包 在配置文件当中,还得要引入一个context约束 <?xml version="1.0& ...

  4. Spring基于注解开发异常

    基于注解开发: 一开始:用的jar包: 百度查到: 导入aop包: 没用 有的说: Spring版本和jdk版本不匹配 于是我换成了4.0版本 导入的jar包: 还是报错. 解决办法:添加spring ...

  5. spring——使用注解开发

    注意:spring4之后,使用注解开发需要导入AOP包org.springframework:spring-aop:5.2.5.RELEASE以及context约束,增加注解的支持 <?xml ...

  6. Spring MVC注解开发入门

    注解式开发初步 常用的两个注解: @Controller:是SpringMVC中最常用的注解,它可以帮助定义当前类为一个Spring管理的bean,同时指定该类是一个控制器,可以用来接受请求.标识当前 ...

  7. Spring原始注解开发-02

    使用@Repository.@Service.@Controller注解配置,使其更加清晰属于哪一层,因为我是模拟的web层,所有没有使用@Controller注解,后面结合web开发会使用到 1.创 ...

  8. spring @Validated 注解开发中使用group分组校验

    之前知道spring支持JSR校验,在自己定义的bean中加入@NotNull,@NotBlank,@Length等之类的校验用于处理前台传递过来的request请求,避免在写多余的代码去处理. 但是 ...

  9. Spring基于注解开发的注解使用之AOP(部分源代码分析)

    AOP底层实现动态代理 1.导入spring-aop包依赖 <!--aopV1--> <dependency> <groupId>org.springframewo ...

  10. Spring MVC 注解开发详解

    @Controller控制器定义 1.Controller是单利模式,被多个线程请求共享,因此设计成无序状态. 2.通过@controller标注即可将class定义为一个controller类.为使 ...

随机推荐

  1. 关于BarchNorm的一些学习

    <Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift> ...

  2. iOS关于高德地图定位和热点搜索使用小结

    最近项目刚刚忙完,有空整理一下用到的相关技术点.地图是比较常见的功能模块,现在用的比较多的是地图当前位置显示,公交.骑行.步行路线信息,附近热点位置搜索.现在国内用的比较多的是高德.百度,国外的话可以 ...

  3. 010 Python 重中之重的变量

    #!/usr/bin/env python # -*- coding:utf-8 -*- # Datatime:2022/7/16 20:32 # Filename:010 Python 重中之重的变 ...

  4. .NET程序获取当前IP经纬度,并通过经纬度实现天气查询功能

      创建一个.net 8的webapi项目备用   编辑一个实体类,该实体类用于存储获取ip地址的经纬度数据使用   继续编辑三个类,用来存储对应经纬度的具体天气数据包:   改造默认的天气控制器,里 ...

  5. Nuxt.js 应用中的 close 事件钩子详解

    title: Nuxt.js 应用中的 close 事件钩子详解 date: 2024/10/13 updated: 2024/10/13 author: cmdragon excerpt: clos ...

  6. 【2022noip多校】异或

    [题目描述] 对于一个元素介于 \([0,2^m)\) 且互不相同的长度为 \(n\) 的序列 \(a_1, a_2 ...,a_n\) ,定义它的特征序列为 \(p_0,p_1,...,p_{2^m ...

  7. 用Qt发布打包的应用程序

    使用Qt Creator创建Realase版本的程序之后,我们的程序可以正常运行,但是在没有Qt的电脑里是无法运行的. 原因说的很清楚,缺少了动态库.所以我们要把其他需要的库打包进来一起发布才可以.Q ...

  8. ToDesk云电脑进军游戏市场,真显卡高性能,新版本可暂停使用时长!

    ToDesk远程控制软件在装机量突破1.5亿后,再度迎来里程碑式的发展.今年,该公司创新推出了云电脑产品,正式涉足云计算领域.这款前沿产品一经发布,便凭借其卓越的性能和使用体验赢得了广大用户的赞誉.近 ...

  9. Java和Python的区别

    Java和Python区别 二者的区别有以下几点:1.Java必须显式声明变量名,而动态类型的Python不需要声明变量.2.Python虚拟机没有Java强,Java虚拟机是Java的核心,Pyth ...

  10. VL4AD:让语义分割认识未知类别,无需额外数据和训练的OOD语义分割 | ECCV'24

    来源:晓飞的算法工程笔记 公众号,转载请注明出处 论文: VL4AD: Vision-Language Models Improve Pixel-wise Anomaly Detection 论文地址 ...