Spring注解开发

Spring是轻代码重配置的框架,配置比较繁重,会影响开发效率。这个时候可以通过注解开发,注解代替xml配置文件可以简化配置,提高开发效率。

Spring原始注解

注解分为原始注解和新注解,主要是从逻辑上分的,并没有实际的影响。
原始注解出现的比较早,主要用来替代标签配置的。

注解 说明
@Component 使用在类上,用于实例化Bean,相当于标签
@Controller 使用在web层类上,用于实例化Bean。语义化的@Component
@Service 使用在service层类上,用于实例化Bean。语义化的@Component
@Repository 使用在dao层类上,用于实例化Bean。语义化的@Component
@Autowired 使用在对象引用字段上,用于根据当前字段类型依赖注入
@Qualifier 使用在对象引用字段上,结合@Autowired一起使用,用于根据名称进行依赖注入
@Resource 使用在对象引用字段上,相当于@Autowired+@Qualifier,按照名称进行依赖注入
@Value 使用在普通类型字段上,注入普通属性
@Scope 使用在类上,标准Bean的作用范围
@PostConstruct 使用在方法上,标注该方法是Bean的初始化方法
@PreDestory 使用在方法上,标注该方法时Bean的销毁方法

上述注解中比较常用的是除最后两个之外的所有注解。

注意

使用注解进行开发时,不需要在applicationContext.xml配置各种Bean了,但是需要配置组件扫描。作用是指定哪个包及其子包下的Bean需要进行扫描,以便识别使用了注解配置的类、字段和方法。

<!--注解的组件扫描-->
<context:component-scan base-package="cs.wy"/>

Spring注解开发 - QuicStart

  • 在 ApplicationContext.xml中中引入context命名空间和约束文件,并添加组件扫描

  • 编写UserDaoImpl类,并使用@Component(或者@Repository)进行标注,告诉Spring容器实例化该类。

 //该接口因为不会被配置进xml文档,所以不需要添加注解public interface UserDao{public void save();}//@Component("userDao") 其中userDao相当于Bean标签的id值@Repository("userDao") // 作用于dao层类上,用于实例化Bean。语义化的 @Component public class UserDaoImpl implements UserDao {@Overridepublic void save() {System.out.println("save running... ...");}}
  • 使用@Compont 或 @Service 标识UserServiceImpl需要Spring进行实例化
  • 使用@Autowired 或者 @Autowired+@Qulifier 或者 @Resource 进行userDao的注入
 //@Component("userService")@Service("userService") // 使用在service层类上,用于实例化Bean。语义化的 @Componentpublic class UserServiceImpl implements UserService {/*@Autowired   使用在对象引用字段上,用于根据当前字段类型依赖注入     * @Qualifier("userDao") 使用在对象引用字段上,结合@Autowired一起使用,用于根据名称进行依赖注入*                    其中,value相当于Bean标签property子标签中ref的值* */   @Resource(name="userDao") // 使用在对象引用字段上,相当于@Autowired+@Qualifier,按照名称进行依赖注入private UserDao userDao;@Overridepublic void save() {userDao.save();}}

用于创建对象的注解:他们的作用都是一样的,如在xml配置文件中,编写一个< bean >标签实现的功能一样的

  • Component:当不知道该类属于软件分层的哪一层时,使用该注解,实例化Bean
    + 作用:用于把当前类对象存入Spring容器中
    * 属性:value:用于指定bean的id,不写,默认是当前类名,首字母小写
  • Controller 使用在web层类上
  • Service 使用在Service层上
  • Repository 使用在Dao层上
  • 上述三个注解作用和属性与 Component 是一模一样的,是Spring框架提供明确的三层使用注解,使三层架构更加清晰

用于注入对象的注解:作用和xml配置文件中的bean标签中写一个property标签作用一样的

  • Autowired :
    * 作用:自动按照类型注入,按照被标注的成员变量的数据类型在Spring容器中进行匹配,如果找到一样的,就把对应的对象赋值给被标注的成员变量。但如果在Spring容器中存在符合要求的多个bean,这个时候会无法识别使用哪个bean。
    * 出现位置:可以是变量上,也可以是方法上
    * 细节:使用注解注入时,set方法可以不写
  • Qualifier:
    * 作用:在按照类中注入的基础上,在按照名称注入,他给类成员注入是不能单独使用,需和@Autowired一起使用,但是在给方法参数注入时可以
    * 属性:value:用于指定注入bean的id值
  • Resource(name=“Bean的名称”)
    * 作用:name为id的值。直接按照Bean的id注入,可以独立使用
    * 属性:name:用于指定bean的id值

    • 以上上个注入都只能注入其他Bean类型的数据,而基本类型和String类型无法使用上述注解实现,另外,集合类型的注入只能通过xml配置来实现
  • Value(“value”):
    * 作用:用于注入基本类型和String类型的数据
    * 属性:value:用于指定数据的值,他可以使用Spring中的SpEL(也就是Spring的el表达式)
    * SpEL的写法:${表达式}
    * KaTeX parse error: Expected 'EOF', got '#' at position 20: …来取外部文件的值 * #̲{}是用来取Bean的属性值,…{jdbc.driver}") 在Spring配置文件中导入Properties文件后,可以通过key(jdbc.driver)获得value值

用于改变作用范围的注解:作用和bean标签中使用scope属性功能一样

  • Scope:
    * 作用:指定bean的作用范围
    * 属性:value:指定范围的取值,value的常用取值有prototype和singleton

和生命周期相关注解

  • @PostConstruct 被标注的成员方法,将成为对象的初始化方法
  • @PreDestroy 被标注的成员方法,将成为对象的销毁方法

Spring常用新注解

使用原始注解不能替代Spring配置文件中全部内容,新注解可以替代如下配置:
1)非自定义的Bean的配置:例如DataSource
2)加载Properties文件的配置:<context:property-placeholder path=“classpath:xxx”/>
3)Spring注解组件扫描器配置:<context:component-scan base-package=""/>
4)引入其他xml配置文件:

针对以上4中情况,Spring提供新注解如下:Spring新注解的替代思想:使用一个类(核心配置类)替代xml核心配置文件,在类上使用注解代替原来xml文件中的标签。

注解 说明
@Configuration 标注在特殊的指定类上,被标注的类就是Spring核心配置类
@ComponentScan(“包名”) 标注在特殊的指定类上,指定组件扫描范围,效果等同于<context:component-scan base-package=“包名”/>
@Bean(“value”) 标注在特殊指定类中的方法上,用于”标注“非自定的Bean,标注方式 有些特殊:Spring会将被标注方法的返回值存储在Spring容器中。效果等同于<bean id=“dataSource” class=“com.mchange.v2.c3p0.ComboPooledDataSource”">
@PropertySource 标注在特殊指定的类上或者其@import类上,将指定的properties文件加载进Spring容器。写法为@PropertySource(“classpath:xxx.properties”)。效果等同于<context:property-placeholder path=“calsspath:xxx”/>
@import 标注在特殊指定的类上,作用:将拆分出去的配置类引入到核心配置类内,写法为:@import({xxx.class, yyy.class})。 效果上等同于

全注解代码如下:

1)创建Spring核心配置类SpringConfiguration.java,并添加对应注解

    //被该注释标注后表示该类为Spring核心配置类@Configuration//指定组件扫描范围,相当于<context:component-scan  base-package="包名"/>@ComponentScan("cs.wy")//引入拆分出去的配置类,相当于<import resource="xxx.xml"/>@Import(DataSourceConfiguration.class)public class SpringConfiguration{}

2)新建jdbc.properties文件,将数据源连接基本参数配置其中:

     jdbc.driver=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://localhost:3306/mavenuser=rootpassword=135246

3)创建Spring核心配置类拆分出去的数据源配置类DataSourceConfiguration.java,并添加相应注解

    //将Properties文件加载进Spring容器,//相当于<context:property-placeholder path="calsspath:xxx"/>@PropertySource("classpath:jdbc.properties")public class DataSourceConfiguration{@Value("${jdbc.driver}")private String driver;@Value("${jdbc.url}")private String url;@Value("${user}")private String username;@Value("${password}")private String password;@Bean("dataSource")public DataSource getDataSource() throws Exception {//创建数据源ComboPooledDataSource dataSource = new ComboPooledDataSource();//为数据源设置连接基本参数dataSource.setDriverClass(driver);dataSource.setJdbcUrl(url);dataSource.setUser(username);dataSource.setPassword(password);//返回创建好的数据源return dataSource;}}

常用新注解详解

Configuration

  • 作用:指定当前类是一个配置类
  • 细节:
    • 当配置类作为AnnotationConfigApplicationContext对象创建参数时,该注解可以不写
    • @Configuration这个注解什么时候必须写,什么时候可以省略
    • 如果在AnnotationConfigApplicationContext(xxx.class)中指定了该配置文件的字节码对象,就可以省略不写
    • 没有指定,就要在主配置文件中要写,扫描子配置类,那么子配置类也必须要写
    • 也可以通过@Import(JdbcConfig.class)来指定子配置类,如果使用也可以省略@Configuration

ComponentScan

  • 作用:用于通过注解指定Spring在创建容器的时候要扫描的包
  • 属性:value:它和basePackages的作用一样的效果等同于<context:component-scan base-package=“包名”/> |

Bean

  • 作用:用于把当前方法的返回值作为bean对象存入Spring的容器中
  • 属性:name用于指定bean的id值,当不写时,默认当前方法的名称
  • 细节:当使用注解配置的时候,如果方法有参数,Spring框架会去容器查找有没有可用的bean对象,查询方式和Autowired注解的作用一样的
    • 先按照类型去找,没有就报错
    • 如果有且只有一个,就自动注入
    • 如果有多个,会按照形参名称去匹配,匹配成功则自动注入
    • 匹配不是还是会报错
    • 可用使用Qualifier去指定要注入的bean的id

Import

  • 作用:导入其他的配置类
  • 属性:value:指定其他配置类的字节码,使用这个注解,有Import的注解类就是父类,导入的都是子类

PropertySource

  • 作用:用于指定properties文件的位置
  • 属性:value:指定文件的路径和名称。
    * 关键字:classpath,表示类路径下
    * 在Spring中如果要读取配置文件,一般都要加classpath:关键字
    * classpath:就是在classpath下面去找
    * classpath*:就在classpath 下面所有的文件去找,包含子目录下

【SSM框架系列】Spring IoC(控制反转) DI(依赖注入)注解开发相关推荐

  1. SSM框架—Spring基础—控制反转和依赖注入(概念)

    控制反转: 控制反转(IoC)是面向对象编程的一个设计原则,用于降低代码耦合度 在传统面向对象编程中,获取对象的方式是用关键字"new"主动创建一个对象,也就是说,应用程序掌握着对 ...

  2. IOC控制反转(依赖注入思想)

    IOC控制反转(依赖注入思想) 获取map 类型的 request session application 的方法: 实现RequestAware,SessionAware,ApplicationAw ...

  3. java json injection_Java Web实现IOC控制反转之依赖注入

    控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的Spring框架的核心. 控制反转一般分为两种类型,依赖注入 ...

  4. Spring的控制反转与依赖注入

    学习过Spring的都知道Spring有三大核心的概念,分别是控制反转(IOC).依赖注入(DI)和面向切面编程(AOP).今天就来聊聊我对控制反转和依赖注入的了解,至于面向切面编程放到后面讲解. 一 ...

  5. Spring中控制反转和依赖注入

    Spring之IOC控制反转和DI依赖注入 1.控制反转是什么? IOC控制反转,所谓反转是指使用方本身不负责依赖对象的创建和维护,而将对象的管理(创建.维护.销毁)都交给Spring容器管理,在使用 ...

  6. spring的控制反转和依赖注入讲解

    1.Spring 1.1 简介 2002年首次推出Spring的雏形,interface21框架 2004正式发布1.0版本 解决企业应用开发的复杂性,其理念是使现有的技术更加容易使用! SSH:St ...

  7. Spring的控制反转以及依赖注入,控制反转使程序具有高拓展性。

    1. 控制反转(Inversion of Control, IOC) 将对象的创建.赋值.管理交给容器(Spring),通过xml文件即可修改对象的属性,不必修改源代码,具有高拓展性.各个模块间的对象 ...

  8. Spring 中控制反转 和 依赖注入 的区别和关系

    控制反转 (IOC),面向对象的一种设计原则,目的是降低耦合度.依赖注入(DI)是实现控制反转的常见方式,控制反转的另外一种实现方式是 依赖查找.控制反转中的控制指的是自己控制(创建)自己的成员变量, ...

  9. spring ioc控制反转

    一. 什么是spring,它能够做什么? Spring是一个开源框架,它由Rod Johnson创建.它是为了解决企业应用开发的复杂性而创建的. Spring使用基本的JavaBean来完成以前只可能 ...

  10. Java之控制反转和依赖注入

    1.简介 依赖注入和控制反转,目的是为了使类与类之间解耦合,提高系统的可扩展性和可维护性,下面通过一个例子来引入这一概念. 2.案例 1)一般情况下的类耦合 Main.java public clas ...

最新文章

  1. linux中间隔10ping一次脚本,linux批量ping脚本shell
  2. Aux函数java,verse.aux
  3. php树形折叠三级菜单模板,三级树形竖向收缩列表菜单
  4. 搜狗浏览器也可以直接安装Chrome插件,太棒了
  5. NFC服务器在Linux,linux 安装 libnfc ,打开串口PN532
  6. Tab标签页接口---使用Intent对象
  7. C#中其他简单LINQ查询表达式的简单使用介绍
  8. mysql date_format格式_mysql date_format 按不同时间单位进行分组统计
  9. 中国农业全要素生产率(1949-2020年)
  10. 【爬虫】python爬取微信公众号
  11. 色纯度(purity)主波长(WD)计算软件(升级版)
  12. 【LaTeX入门】15 在文章中添加脚注
  13. Word2003入门动画教程75:在Word中插入文本框
  14. 从一循环到150,并在每行打印一个值,另外在每个3的倍数行上打印出“foo“,在5的倍数行打印biz,在7的倍数行打印baz
  15. 【51nod】2591 最终讨伐
  16. 关于Python_fluent
  17. 装了就不舍得卸载,4款电脑必装软件,功能实用又免费
  18. 八七、Node.js事件循环与多进程
  19. dao层通用封装_层超类型模式:封装多层系统中的通用实现
  20. pos共识机制_PoS共识机制是什么?其优缺点分别是什么?

热门文章

  1. zTree 异步加载 添加子节点重复问题 .
  2. 利用规则引擎计算个人所得税学习
  3. SQL中 不等于时存在null的问题
  4. .net c# 序列化和反序列
  5. springcloud 并发_SpringCloud-Zuul高并发请求下的限流处理
  6. document.getElementsByTagName()方法的返回值
  7. mini2440 裸机编程 -led
  8. golang中的切片
  9. golang切片传参
  10. redis之intset