Spring纯注解开发模式让开发简化更简化

 更新时间:2022年08月03日 16:37:45   作者:懒羊羊.java  
Spring3.0引入了纯注解开发的模式,框架的诞生是为了简化开发,那注解开发就是简化再简化。Spring的特性在整合MyBatis方面体现的淋漓尽致哦

一.注解开发

以前跟老韩学习SE时他就说:

注解本质是一个继承了Annotation 的特殊接口,其具体实现类是Java 运行时生成的动态代理类。

而我们通过反射获取注解时,返回的是Java 运行时生成的动态代理对象$Proxy1。通过代理对象调用自定义注解(接口)的方法,会最终调用AnnotationInvocationHandler 的invoke 方法。该方法会从memberValues 这个Map 中索引出对应的值。而memberValues 的来源是Java 常量池。

二.注解定义Bean

注解开发前,配置Bean时是在xml里将class分别写在Bean标签里,然后起id,就像这样

<bean id="a" class="yu7daily.Dao.Daoimpl.A" />

注解开发后,配置Bean时首先将xml里的<Bean>标签删掉,然后在类上添加@Component注解即可

@Component("a")
 public class A implements AA {
    public void save() {
  System.out.println("book dao save ..." ); 
  	}
 }

在xml文件中来写一个扫描包的注解标签,对象就装进IOC容器里了

<context:component-scan base-package="yu7daily.Dao"/>

component-scan:component意为组件,scan意为扫描

包路径越多,扫描的范围越小速度越快·包路径越少,扫描的范围越大速度越慢

最后直接从容器获取对象

    public static void main(String[] args) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        A aa = (A) ctx.getBean("a");
        bookService.save();
    }

这里要注意的是:由于接口无法创建对象,所以别把注解写在接口上!!

注解真是神奇啊,他和原先的xml里的Bean到底是什么关系呢?

三.衍生注解

对于@Component还有衍生的三个注解:

@Controller、@Service、@Repository

结合与MVC的模式分别起到了补充的作用,方便我们后期在编写类的时候能很好的区分出这个类是属于表现层、业务层还是数据层的类

四.纯注解开发模式

顾名思义,纯注解的模式就是摒弃以前的配置操作,全部由注解来完成

@Configuration:类注解,设置该类为Spring配置类

@ComponentScan:类注解,设置Spring配置类扫描路径

1.写一个配置类,通过注解@Configuration来标注该类为配置类、@ComponentScan来配置包扫描

这样就替换掉了<context:component-scan base-package="yu7daily.Dao"/>

@Configuration
@ComponentScan("yu7daily")
public class Config {...}

然后类就被放进了Bean里,通过

ApplicationContext acct = new AnnotationConfigApplicationContext(Config.class);就可以得到Bean

一顿操作下来我们通过一个Java类替换掉了Spring的核心配置文件,完全告别了xml!

配置Bean作用域

我们知道,通过Bean造的对象默认都是单例的,如何造出非单例的Bean?

通过@Scope注解即可,属性值(默认singleton(单例),可选值prototype(非单例))

@Component("a")
@Scope("prototype")
public class A implements AA {
    public void save() {
        System.out.println("hello~");
    }
}

五.注解实现注入

Set注入的原理是通过set方法在容器内部将一个类设置到另一个类中,这也是比较常用的方法。那么在纯注解开发的模式下如何实现注入呢?

@Service
public class A implements AA { 
    @Autowired
    private B b;
 }

如上,通过在属性上添加注解@Autowired就实现了将B注入到A中

1.自动装配

在前面写配置文件的阶段autowire属性可以开启自动装配,通常使用按类型装配autowire="byType"

对于自动装配的理解:在set注入的基础上配置文件写的更加简洁,因为在Service里写了set方法把Dao的对象搞到了Service里,所以在配置Bean的时候我们通过自动装配,在xml文件里实现了Service和Dao自动结合,不再需要去Service里通过property标签来指定相应的name-ref

自动装配基于反射设计创建对象并通过暴力反射为私有属性进行设值普通反射只能获取public修饰的内容,暴力反射除了获取public修饰的内容还可以获取private修改的内容,注解的模式就是体现形式的变式,自动装配本质还是没有变

2.按名称注入

针对相同类型的Bean如果IOC中存在多个,那按照类型注入一定会出错,就像这样

我通过注解注入的方式,注入了两个AA的实现类到B中,然后通过B来调用AA接口下的save()方法讲道理应该输出“hello~A”,结果出现了NoUniqueBeanDefinitionException

可见按照类型注入还是存在弊端啊,如何解决?

我们可以通过按照名称注入的方式:

当根据类型在容器中找到多个bean,注入参数的属性名又和容器中bean的名称不一致,这个时候该如何解决,就需要使用到注解@Qualifier 来指定注入哪个名称的bean对象,在不修改其他条件下,就像这样

@Repository("b")
public class B implements BB {
    @Autowired
    @Qualifier("a") //注入指定的对象名称
    private AA aa;
    public void save() {
        aa.save();
    }
}

随着运行结果,输出了A的成员方法,说明注入成功!

值得注意的是:@Qualifier不能独立使用,必须和@Autowired一起使用!!!

3.简单数据注入

通过注解@value可以实现简单数据注入,以String类型数据为例

  @Repository("a")
  public class A implements AA {
  @Value("hello java")
 private String str;
  public void save() {
System.out.println(str); 
    }
 }

 运行结果:hello

其实上述操作看起来有点多此一举,@value主要还是为了读取配置文件而服务的

4.读取properties配置文件

首先在配置类上写上注解@PropertySource用来指明读取目录下的哪个文件

@Configuration
@ComponentScan("yu7daily")
@PropertySource("test.properties")
public class SpringConfig { 
  }

在相应的属性上配置@Value注解即可完成配置文件属性的读取

PS:配置文件内容——name=lanyangyang

  @Repository("a")
  public class A implements AA {
  @Value("${name}")
 private String str;
  public void save() {
System.out.println(str); 
    }
 }

 运行结果:lanyangyang

其实读取配置文件连接数据库也是这套操作

六.Spring整合MyBatis

在配置好MyBatis的基础上(不熟悉的可以去看一下以前写的MyBatis文章),Spring的整合工作就变的非常简单,主要工作就是管理MyBatis中的SqlSessionFactory和Mapper接口的扫描

1.首先导入两个整合需要的的jar包:

<artifactId>spring-jdbc</artifactId>13<artifactId>mybatis-spring</artifactId>

2.配置数据源对象

2.创建主配置类

@Configuration
@ComponentScan("yu7daily")
@PropertySource("classpath:jdbc.properties")
4@Import({JdbcConfig.class,MybatisConfig.class})
public class SpringConfig {...}

3.创建MyBatis配置类并获得SqlSessionFactory对象

4.最后在主函数中得到对应的Bean即可进行对数据层的操作

        ApplicationContext ACC = new AnnotationConfigApplicationContext(SpringConfig.class);
        AccountService acc = ACC.getBean(AccountService.class);

这工作量比原来是不是简单多了,简直太哇塞了

到此这篇关于Spring纯注解开发模式让开发简化更简化的文章就介绍到这了,更多相关Spring注解开发内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring Boot高级教程之Spring Boot连接MySql数据库

    Spring Boot高级教程之Spring Boot连接MySql数据库

    这篇文章主要为大家详细介绍了Spring Boot高级教程之Spring Boot连接MySql数据库,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • MapTask工作机制图文详解

    MapTask工作机制图文详解

    今天小编就为大家分享一篇关于MapTask工作机制图文详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • 使用自定义注解实现redisson分布式锁

    使用自定义注解实现redisson分布式锁

    这篇文章主要介绍了使用自定义注解实现redisson分布式锁,具有很好的参考价值,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • 深入理解Java中的HashMap

    深入理解Java中的HashMap

    HashMap是Java程序员使用频率最高的用于映射(键值对)处理的数据类型。随着JDK(Java Developmet Kit)版本的更新,JDK1.8对HashMap底层的实现进行了优化,例如引入红黑树的数据结构和扩容的优化等。本文将深入探讨HashMap的结构实现和功能原理
    2021-06-06
  • java多种幻灯片切换特效(经典)

    java多种幻灯片切换特效(经典)

    功能说明: 代码实现了多种幻灯片变换特效. 如:淡入淡出、缓慢覆盖、旋转覆盖等10多种变换效果。
    2013-03-03
  • java多线程编程学习(线程间通信)

    java多线程编程学习(线程间通信)

    下面小编就为大家带来一篇java多线程编程学习(线程间通信)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • Leetcode常见链表问题及代码示例

    Leetcode常见链表问题及代码示例

    这篇文章主要介绍了Leetcode常见链表问题及代码示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • 基于XML的MyBatis的环境搭建过程详解(IDEA)

    基于XML的MyBatis的环境搭建过程详解(IDEA)

    这篇文章主要介绍了基于XML的MyBatis的环境搭建过程详解(IDEA),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • java基于正则表达式实现时间日期的常用判断操作实例

    java基于正则表达式实现时间日期的常用判断操作实例

    这篇文章主要介绍了java基于正则表达式实现时间日期的常用判断操作,简单说明了正则表达式常用元字符含义并结合实例形式分析了java基于正则表达式针对常用日期时间格式的判断操作技巧,需要的朋友可以参考下
    2017-10-10
  • spring启动错误Singleton bean creation not allowed while the singletons of this factory are indestruction

    spring启动错误Singleton bean creation not al

    本文主要介绍了spring启动错误Singleton bean creation not allowed while the singletons of this factory are indestruction,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07

最新评论