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

 老规矩:929412b23af14c2ea865e73cd5e4e1f3.png

 

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

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

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

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

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

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

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

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

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

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

 配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
        <!-- base-package:表示扫描的包如果扫描的包是两个包中间可以用逗号隔开
                            也可以把包定位在上层包-->
<context:component-scan base-package="new_study.comment,new_study.java_file"></context:component-scan>
<!--component-scan:意思就是元素扫描 base-package:就是包,你扫描的位置-->

</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名改为创建注解是设置的名称

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class testdemo {
    @Test
    public void play(){
        ApplicationContext context = new ClassPathXmlApplicationContext("new_study/comment/create/bean.xml");
        demo1 demo1 = context.getBean("d1",demo1.class);
        demo1.play();
    }
}

输出结果:

ac9d6aaeb2cb420bb5072790a53e539c.png

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

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

代码一:

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

<!--代码介绍:
    use-defaultfilters="false":表示扫描的地址不在是前面设置的地址,而是后面的配置类型
    context:include-filter:表示的是包含的内容,设置扫描的内容包含。。。上面的案例:表示扫描注解类型为Controller的类.其他的都忽略
    type="annotation":类型为注解
    -->

代码二:

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


<!--context:exclude-filter:表示:除了。。。其他的都扫描。上面的案例:表示除了注解类型为Controller,其他的都进行扫描-->

 基于注解方式注入属性

属性注解标记:

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

    @Service
    public class class1 {
        public void add(){
            inter1 inter1 = new class2();
    
            inter1.add();
            System.out.println("bbbbbbbbbbbbbb");}
        public static void main(String[] args) {
            class1 class1 = new class1();
            class1.add();
        }
    
    }
    @Service
    class class2 implements inter1{
        public void add(){
            System.out.println("aaaaaaaaaaaaaaaaaaa");
        }
    
    }
    interface inter1{
        public  void add();
    }
    

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

    @Service
    public class class1 {
        @Autowired   //这是属性注解标记
        private inter1 inter1;
        public void add(){
            inter1.add();
            System.out.println("bbbbbbbbbbbbbb");
        }
    
    }
    @Service
    class class2 implements inter1{
        public void add(){
            System.out.println("aaaaaaaaaaaaaaaaaaa");
        }
    
    }
    interface inter1{
        public  void add();
    }

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

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                                http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
        <!-- base-package:表示扫描的包如果扫描的包是两个包中间可以用逗号隔开
                            也可以把包定位在上层包-->
        <context:component-scan base-package="new_study.comment,new_study.java_file"></context:component-scan>
    
    </beans>

    测试类:

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

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

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

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

  • 代码实现:
  • package new_study.comment.create;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.stereotype.Service;
    
    //通过注解的方式向属性自动装配值
    @Service
    public class class1 {
        @Autowired     //使用注解的方式来注入减少代码
         @Qualifier(value = "mm")//定义接口实现类的位置
        private inter1 inter1;
        public void add(){
            inter1.add();
            System.out.println("bbbbbbbbbbbbbb");
        }
    
    }
    @Service(value = "myc")              //接口实现类一
    class class2 implements inter1{
        public void add(){
            System.out.println("aaaaaaaaaaaaaaaaaaa");
        }
    
    }
    interface inter1{
        public  void add();
    }
    @Service(value = "mm")              //接口实现类二
    class demo3 implements inter1{
        public void add(){
            System.out.println("ccccccccccc");
            }
            }

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

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

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

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

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

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

@Value(value = "abc")

private String name;

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

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

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

配置类:

@Configuration   //把当前类作为配置类,去替代配置文件
@ComponentScan(basePackages = "new_study.comment.create")  //它的作用就是xml配置文件中的那行代码 <context:component-scan base-package="new_study.comment.create"></context:component-scan>
public class xml {
}

测试类:

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

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

Copyright © 2010-2022 mfbz.cn 版权所有 |关于我们| 联系方式|豫ICP备15888888号