注解的好处:如果管理很多的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. USB gadget驱动框架(三)

    gadget驱动框架(三) usb_udc与usb_gadget_driver的绑定 usb_udc与usb_gadget_driver,在注册的时候分别被添加到udc_list和gadget_dri ...

  2. .NET高级调试 - 3.8线程操作

    简介 高级调试过程中,与线程与线程栈是打交道特别多的.因此如何查看线程与线程栈就显得至关重要了 查看线程 !Threads 使用 !t/!Threads 命令获取所有托管线程 含义 ThreadCou ...

  3. USACO 2023 December Contest, Gold

    Problem 1. Flight Routes 设原图的邻接矩阵为 \(e\),考虑它给我们的矩阵是什么东西. 设 \(d_{i, j}\) 表示 \(i\) 到 \(j\) 的路径数的奇偶性,那么 ...

  4. 【Azure Cloud Service】使用Key Vault Secret添加.CER证书到Cloud Service Extended Support中

    问题描述 因为Key Vault的证书上传功能中,只支持pfx格式的证书,而中间证书,根证书不能转换为pfx格式,只能是公钥证书格式 cet 或者 crt,能通过文本工具直接查看base64编码内容. ...

  5. Centos7下非lvm的分区扩容

    Centos7下非lvm的分区扩容(重要) 前言:一般在生产环境中,如果需要使用一个分区保存大量的文件,建议的做法是在虚拟化环境中增加一块单独的硬盘,挂载一个单独的分区,比如 /data 上图我们可以 ...

  6. ToDesk云电脑实测!轻松应对游戏电竞、AIGC创作、设计建模等场景

    万物智联时代,现代社会对数字计算的需求呈指数级增长.当算力成为推动技术创新和应用发展的重要引擎,云电脑产业正在悄然占据国内算力应用的市场,成为新时代的数字经济发展方向.1 云电脑,顾名思义,是一台随时 ...

  7. AI五子棋_05 公钥加解密 10进制转256进制

    AI 五子棋 第五步 恭喜你到达第五步! 我想你一定很艰难,前一步的问题需要大数运算,因为这个算法依赖于质因数分解的复杂度,只有数字相当大时才能保证这个算法难于破解. 这是服务器使用的公钥: 6553 ...

  8. Selenium实现元素定位

    Selenium提供了定位元素的方法find_element(),该方法被定义在WebDriver类中. 一.参数 1.两个参数,参数1根据不同定位方法确定,定位方法如下: (1)通过id定位:使用参 ...

  9. Expo上手

    RN中文网:https://reactnative.cn/docs/next/native-modules-android RN路由:https://reactnavigation.org/docs/ ...

  10. PS命令显示进程数,清理僵尸进程

    显示系统上所有进程的进程树 ps -ef --forest 显示给定进程的进程树 -C:Select by command name.这个命令会把name指定进程的所有子进程显示出来 [root@lo ...