• IOC操作-bean管理:基于注解的方式来创建对象和(自动装配)属性注入以及完全注解开发方式


     老规矩:929412b23af14c2ea865e73cd5e4e1f3.png

     

     

     

    前几篇文章介绍了bean管理的一些的基本操作,但是呢这些的操作对与没有框架的程序来说是简便了些,但对于大型的程序来说,就有所繁琐,从这篇博客开始主要介绍更加简便的方法。本篇文章从创建对象这一基本步骤来说。如果对于前面关于Spring的文章没有了解,建议去主页浏览一下基本的操作。

     之前介绍了创建对象的集中方法,接下来通过注解的方法来创建对象。

    什么是注解,可能有点不懂但是说到注释,你可能就能明白了,那注释等于注解吗?答案是否定的但是结构没有太大的区别。注解也拥有特殊符号。

    注解就是代码拥有的特殊标记,

    1. 注解格式:@注解名称(属性名称1=属性值,属性名称2=属性值.......)
    2. 用法:注解的位置主要放在类.方法.属性上面
    3. 为什么使用注解:注解可以减少配置文件的配置

    spring当中那些代码提供注解作用:

    1. @Component
    2. @Service
    3. @Controller
    4. @Repository

    注意:上面的四个的作用都是一样的,都可以创建实例对象等。

    代码实现:下面代码创建的注解是通过Component来实现的,其他的三个也可以只需要把Component名称改换另外的三个即可。

    1. import org.springframework.stereotype.Component;
    2. @Component (value = "d1") //提供注解的代码
    3. public class demo1 {
    4. public void play(){
    5. System.out.println("看看我是否输出");
    6. }
    7. }

     配置文件:

    1. "1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3. xmlns:context="http://www.springframework.org/schema/context"
    4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    5. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    6. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
    7. <context:component-scan base-package="new_study.comment,new_study.java_file">context:component-scan>
    8. beans>

    注意配置文件中的地址发生的变化,下面位置介绍配置文件的属性名称代表的具体含义

    因为XML文档都有格式,为了spring的配置文件增加的节点能满足要求、合法,所以引入校验该xml的格式文件。

    xmlns是xml命名空间的意思,而xmlns:xsi是指xml所遵守的标签规范。

    1.xmlns:关于初始化bean的格式文件地址

    2.xmlns:xsi:辅助初始化bean

    3.xsi:context:关于spring上下文,包括加载资源文件

    4.xsi:schemaLocation:用于声明了目标名称空间的模式文档

     测试类:

    注意:测试类和之前的没有太大的变化,但是因为配置的变化有一点注意到getbean方法中获取的name名改为创建注解是设置的名称

    1. import org.junit.Test;
    2. import org.springframework.context.ApplicationContext;
    3. import org.springframework.context.support.ClassPathXmlApplicationContext;
    4. public class testdemo {
    5. @Test
    6. public void play(){
    7. ApplicationContext context = new ClassPathXmlApplicationContext("new_study/comment/create/bean.xml");
    8. demo1 demo1 = context.getBean("d1",demo1.class);
    9. demo1.play();
    10. }
    11. }

    输出结果:

    ac9d6aaeb2cb420bb5072790a53e539c.png

    上面的步骤完成了注解的基本构造和实现的方法,但是这里面还有一大问题就是在你扫描的位置拥有很多的类,这样忙目的扫描可能会占用更大的内存,接下来介绍一种配置代码,可以修改你扫描类型

    修改扫描细节配置:修改配置文件的内容,其他的基本不变

    代码一:

    1. <context:component-scan base-package="com.atguigu" use-defaultfilters="false">
    2. <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    3. context:component-scan>

     

    代码二:

    1. <context:component-scan base-package="com.atguigu">
    2. <context:exclude-filter type="annotation"
    3. expression="org.springframework.stereotype.Controller"/>
    4. context:component-scan>

     基于注解方式注入属性

    属性注解标记:

    1. Autowired:根据属性类型进行自动装配(自动装配:减少代码减少内存的占用,实现框架)案例展示:假设有一个接口我们做的是通过类一去调用接口

      1. @Service
      2. public class class1 {
      3. public void add(){
      4. inter1 inter1 = new class2();
      5. inter1.add();
      6. System.out.println("bbbbbbbbbbbbbb");}
      7. public static void main(String[] args) {
      8. class1 class1 = new class1();
      9. class1.add();
      10. }
      11. }
      12. @Service
      13. class class2 implements inter1{
      14. public void add(){
      15. System.out.println("aaaaaaaaaaaaaaaaaaa");
      16. }
      17. }
      18. interface inter1{
      19. public void add();
      20. }

      上面阐述的代码是基础实现的代码,接下来通过注解的方式来实现注入属性,框架是需要通过配置文件来进行实现·

      1. @Service
      2. public class class1 {
      3. @Autowired //这是属性注解标记
      4. private inter1 inter1;
      5. public void add(){
      6. inter1.add();
      7. System.out.println("bbbbbbbbbbbbbb");
      8. }
      9. }
      10. @Service
      11. class class2 implements inter1{
      12. public void add(){
      13. System.out.println("aaaaaaaaaaaaaaaaaaa");
      14. }
      15. }
      16. interface inter1{
      17. public void add();
      18. }

      主页上有关于spring的专栏可以进详细的了解

      1. "1.0" encoding="UTF-8"?>
      2. <beans xmlns="http://www.springframework.org/schema/beans"
      3. xmlns:context="http://www.springframework.org/schema/context"
      4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      5. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
      6. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
      7. <context:component-scan base-package="new_study.comment,new_study.java_file">context:component-scan>
      8. beans>

      测试类:

      1. @Test
      2. public void play2(){
      3. ApplicationContext context = new ClassPathXmlApplicationContext("new_study/comment/create/bean2.xml");
      4. class1 class1 = context.getBean("class1",class1.class);
      5. class1.add();
      6. }

      配置文件和测试类在之前的博客中有代码的介绍,看不懂的可以去主页了解一下

    2. @Qualifier:根据名称进行注入

    (注意:@Qualifier需要与Autowired连用:因为接口可以拥有很多的实现类,而当我们需要一个具体类的实现方法时,@Autowired是没有办法去实现的·而@Qualifier可以很好的解决这个问题,因为@Qualifier是通过名称来注入的,可以通过名称直接定位到需要的类中

    • 代码实现:
      1. package new_study.comment.create;
      2. import org.springframework.beans.factory.annotation.Autowired;
      3. import org.springframework.beans.factory.annotation.Qualifier;
      4. import org.springframework.stereotype.Service;
      5. //通过注解的方式向属性自动装配值
      6. @Service
      7. public class class1 {
      8. @Autowired //使用注解的方式来注入减少代码
      9. @Qualifier(value = "mm")//定义接口实现类的位置
      10. private inter1 inter1;
      11. public void add(){
      12. inter1.add();
      13. System.out.println("bbbbbbbbbbbbbb");
      14. }
      15. }
      16. @Service(value = "myc") //接口实现类一
      17. class class2 implements inter1{
      18. public void add(){
      19. System.out.println("aaaaaaaaaaaaaaaaaaa");
      20. }
      21. }
      22. interface inter1{
      23. public void add();
      24. }
      25. @Service(value = "mm") //接口实现类二
      26. class demo3 implements inter1{
      27. public void add(){
      28. System.out.println("ccccccccccc");
      29. }
      30. }

      上述代码中有两个接口实现类,可以通过创建对象来定义名称,再通过@Qualifier:来向实现类进行选择。

    3.@Resource:可以根据类型注入,可以根据名称注入

    @Resource //根据类型进行注入用法和Autowired:一致

    @Resource(name = "userDaoImpl1") //根据名称进行注入 用法和@Qualifier:差不多但有不同,它不要同Autowired:联用可以单独使用

    1. //@Resource //根据类型进行注入
    2. @Resource(name = "userDaoImpl1") //根据名称进行注入

     4.@Value:注入普通类型属性

    1. @Value(value = "abc")
    2. private String name;

     上面介绍了配置扫描类型的细节问题,和自动装配的实现代码,不要小看这几行代码,在真正的项目中蕴含巨大的作用,细节决定成败

    接下来spring-ioc-bean管理中的完全注解开发

    什么是完全注解开发:用类去替代配置文件,通过用完全注解标记的方法去实现开发

    配置类:

    1. @Configuration //把当前类作为配置类,去替代配置文件
    2. @ComponentScan(basePackages = "new_study.comment.create") //它的作用就是xml配置文件中的那行代码
    3. public class xml {
    4. }

    测试类:

    1. public void play2(){
    2. ApplicationContext context = new AnnotationConfigApplicationContext(xml.class);
    3. class1 class1 = context.getBean("class1",class1.class);
    4. class1.add();
    5. }
    6. //代码几乎没有改变,改变的是AnnotationConfigApplicationContext(xml.class):注解对象xml.class则为上述配置的配置类

    完全注解开发方式,可以减少配置使步骤更加的节约,代码执行更加的顺畅,上述代码是发生改变的地方,其他的代码前文都有介绍。

     

  • 相关阅读:
    Sui提供dApp Kit 助力快速构建React Apps和dApps
    【mmWave】二、IWR6843ISK-ODS毫米波雷达【固件开发】流程
    事业编招聘:国家无线电监测中心2022年公开招聘
    英语——分享篇——每日100词——601-700
    1688API接口,获取商品详情,按关键词搜索,拍立淘,商品评论商品类目,店铺接口等
    Element-plus提交pr有感
    Java项目:32 基于springboot的课程作业管理系统(含源码数据库+文档免费送)
    工控机专业知识解析
    基于Ubuntu Server编译YTM32 SDK工程
    JavaScript大作业——美食餐饮网站设计与实现(HTML+CSS+JavaScript)
  • 原文地址:https://blog.csdn.net/m0_52479012/article/details/127062015