美文网首页
18-Spring_基于 XML 的配置和依赖注解

18-Spring_基于 XML 的配置和依赖注解

作者: lww文 | 来源:发表于2019-08-13 15:23 被阅读0次

    第一步:拷贝必备的 jar 包到工程的 lib 目录中

    如果使用的是maven,需要在pop.xml中加入

    第二步:在类的根路径下创建一个任意名称的 xml 文件(xxx.xml)

    <!-- bean 标签:用于配置让 spring 创建对象,并且存入 ioc 容器之中

    id 属性:对象的唯一标识。

    class 属性:指定要创建对象的全限定类名

    -->

    <!-- 配置 service -->

    <bean id="accountService" class="com.xxx.service.impl.AccountServiceImpl">

    </bean>

    <!-- 配置 dao -->

    <bean id="accountDao" class="com.xxx.dao.impl.AccountDaoImpl"></bean>

    测试

    //1.获取核心容器对象

    ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");

    //2.根据id获取Bean对象

    IAccountService as = (IAccountService)ac.getBean("accountService");

    IAccountDao adao = ac.getBean("accountDao",IAccountDao.class);

    System.out.println(as);

    System.out.println(adao);

    =================

            Spring 基于 XML 的 IOC 细节

    BeanFactory 和 ApplicationContext 的区别

    BeanFactory 才是 Spring 容器中的顶层接口。

     ApplicationContext 是它的子接口。 

     BeanFactory 和 ApplicationContext 的区别:

    创建对象的时间点不一样。

    ApplicationContext:只要一读取配置文件,默认情况下就会创建对象。  (多例对象使用)

     BeanFactory:什么使用什么时候创建对象。  (单利对象使用)

    ApplicationContext 接口的实现类

    ClassPathXmlApplicationContext: 它是从类的根路径下加载配置文件 推荐使用这种

    FileSystemXmlApplicationContext: 它是从磁盘路径上加载配置文件,配置文件可以在磁盘的任意位置。

    AnnotationConfigApplicationContext: 当我们使用注解配置容器对象时,需要使用此类来创建 spring 容器。它用来读取注解。

    核心容器的两个接口引发出的问题:

    ApplicationContext: 单例对象适用 采用此接口 它在构建核心容器时,创建对象采取的策略是采用立即加载的方式。也就是说,只要一读取完配置文件马上就创建配置文件中配置的对象。

     BeanFactory: 多例对象使用 它在构建核心容器时,创建对象采取的策略是采用延迟加载的方式。也就是说,什么时候根据id获取对象了,什么时候才真正的创建对象。

    IOC 中 bean 标签和管理对象细节

    bean标签

    作用: 用于配置对象让 spring 来创建的。

     默认情况下它调用的是类中的无参构造函数。如果没有无参构造函数则不能创建成功。

    属性: id:给对象在容器中提供一个唯一标识。用于获取对象。

    class:指定类的全限定类名。用于反射创建对象。默认情况下调用无参构造函数。

    scope:指定对象的作用范围。 *

             singleton :默认值,单例的. *

             prototype :多例的. *

           request :WEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 request 域中.

          * session :WEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 session 域中. *

            global session :WEB 项目中,应用在 Portlet 环境.如果没有 Portlet 环境那么 globalSession 相当于 session.

           init-method:指定类中的初始化方法名称。 destroy-method:指定类中销毁方法名称。

    bean的生命周期和作用范围

    单例对象:scope="singleton"

    一个应用只有一个对象的实例。它的作用范围就是整个引用。

    生命周期: 

      对象出生:当应用加载,创建容器时,对象就被创建了。

      对象活着:只要容器在,对象一直活着。

    对象死亡:当应用卸载,销毁容器时,对象就被销毁了。

    多例对象:scope="prototype"

     每次访问对象时,都会重新创建对象实例。

    生命周期: 对象出生:当使用对象时,创建新的对象实例。

    对象活着:只要对象在使用中,就一直活着。

    对象死亡:当对象长时间不用时,被 java 的垃圾回收器回收了。

    ======

    实例化 Bean 的三种方式

    第一种方式:使用默认无参构造函数

    <!--在默认情况下:

    它会根据默认无参构造函数来创建类对象。如果 bean 中没有默认无参构造函数,将会创建失败。-->

    <bean id="accountService" class="com.xxx.service.impl.AccountServiceImpl"/>

    第二种方式:spring 管理静态工厂-使用静态工厂的方法创建对象

      模拟一个静态工厂,创建业务层实现类*

    /public class StaticFactory {

      public static IAccountService createAccountService(){

          return new AccountServiceImpl();}

      }

    <!-- 此种方式是:

    使用 StaticFactory 类中的静态方法 createAccountService 创建对象,并存入 spring 容器

    id 属性:指定 bean 的 id,用于从容器中获取

    class 属性:指定静态工厂的全限定类名

    factory-method 属性:指定生产对象的静态方法

    -->

    <bean id="accountService"

    class="com.xxx.factory.StaticFactory"

    factory-method="createAccountService"></bean>

    第三种方式:spring 管理实例工厂-使用实例工厂的方法创建对象

    /** * 模拟一个实例工厂,创建业务层实现类 * 此工厂创建对象,必须现有工厂实例对象,再调用方法 */

    public class InstanceFactory {

          public IAccountService createAccountService(){

               return new AccountServiceImpl();

    } }

    <!-- 此种方式是:

    先把工厂的创建交给 spring 来管理。

    然后在使用工厂的 bean 来调用里面的方法

    factory-bean 属性:用于指定实例工厂 bean 的 id。

    factory-method 属性:用于指定实例工厂中创建对象的方法。

    -->

    <bean id="instancFactory" class="com.xxx.factory.InstanceFactory"></bean>

    <bean id="accountService"factory-bean="instancFactory" factory-method="createAccountService"></bean>

    ====================

        spring 的依赖注入

    spring中的依赖注入 依赖注入: Dependency Injection

    IOC的作用: 降低程序间的耦合(依赖关系)

    依赖关系的管理: 以后都交给spring来维护 在当前类需要用到其他类的对象,由spring为我们提供,我们只需要在配置文件中说明 依赖关系的维护: 就称之为依赖注入。

    依赖注入: 能注入的数据:

    有三类

    基本类型和String

    其他bean类型(在配置文件中或者注解配置过的bean)

    复杂类型/集合类型

    注入的方式:有三种

    第一种:使用构造函数提供

    第二种:使用set方法提供

     第三种:使用注解提供

    =================

    构造函数注入: 

    使用的标签:constructor-arg

    标签出现的位置:bean标签的内部

     标签中的属性

     type:用于指定要注入的数据的数据类型,该数据类型也是构造函数中某个或某些参数的类型

     index:用于指定要注入的数据给构造函数中指定索引位置的参数赋值。索引的位置是从0开始

    name:用于指定给构造函数中指定名称的参数赋值 常用的

     =============以上三个用于指定给构造函数中哪个参数赋值===============================

     value:用于提供基本类型和String类型的数据

    ref:用于指定其他的bean类型数据。它指的就是在spring的Ioc核心容器中出现过的bean对象

    优势:

    在获取bean对象时,注入数据是必须的操作,否则对象无法创建成功。

     弊端: 改变了bean对象的实例化方式,使我们在创建对象时,如果用不到这些数据,也必须提供。

    例如:

    bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl">
    <constructor-arg name="name" value="泰斯特"></constructor-arg>
    <constructor-arg name="age" value="18"></constructor-arg>
    <constructor-arg name="birthday" ref="now"></constructor-arg>
    </bean>

    <!-- 配置一个日期对象 -->
    <bean id="now" class="java.util.Date"></bean>

    =========================

    set方法注入 更常用的方式

    涉及的标签:property

    出现的位置:bean标签的内部

    标签的属性

    name:用于指定注入时所调用的set方法名称

    value:用于提供基本类型和String类型的数据

    ref:用于指定其他的bean类型数据。它指的就是在spring的Ioc核心容器中出现过的bean对象

    优势: 创建对象时没有明确的限制,可以直接使用默认构造函数

    弊端: 如果有某个成员必须有值,则获取对象是有可能set方法没有执行。

    例如

    <bean id="accountService2" class="com.itheima.service.impl.AccountServiceImpl2">
    <property name="name" value="TEST" ></property>
    <property name="age" value="21"></property>
    <property name="birthday" ref="now"></property>
    </bean>

    复杂类型的注入/集合类型的注入

     用于给List结构集合注入的标签:

    list  array  set 用于个Map结构集合注入的标签:

    map  props 结构相同,标签可以互换

    给properties注入数据

    ===============

    常用注解

    @Component

    作用: 把资源让 spring 来管理。相当于在 xml 中配置一个 bean。

    属性: value:指定 bean 的 id。如果不指定 value 属性,默认 bean 的 id 是当前类的类名。首字母小写。

     @Controller @Service @Repository

    他们三个注解都是针对一个的衍生注解,他们的作用及属性都是一模一样的。 他们只不过是提供了更加明确的语义化。

     @Controller:一般用于表现层的注解。

    @Service:一般用于业务层的注解。

    @Repository:一般用于持久层的注解。

    细节:如果注解中有且只有一个属性要赋值时,且名称是 value,value 在赋值是可以不写。

     ==================用于注入数据的======

    @Autowired

    作用: 自动按照类型注入。当使用注解注入属性时,set 方法可以省略。它只能注入其他 bean 类型。当有多个 类型匹配时,使用要注入的对象变量名称作为 bean 的 id,在 spring 容器查找,找到了也可以注入成功。找不到 就报错。

    @Qualifier

    作用: 在自动按照类型注入的基础之上,再按照 Bean 的 id 注入。它在给字段注入时不能独立使用,必须和 @Autowire 一起使用;但是给方法参数注入时,可以独立使用。

    属性: value:指定 bean 的 id。

    @Resource

    作用:直接按照 Bean 的 id 注入。它也只能注入其他 bean 类型。

    属性:name:指定 bean 的 id。

    @Value

    作用: 注入基本数据类型和 String 类型数据的

    属性: value:用于指定值

    ==============用于改变作用范围的:===========

    @Scope

    作用: 指定 bean 的作用范围。

    属性: value:指定范围的值。 取值:singleton prototype request session globalsession

    ===================和生命周期相关的===========

    @PostConstruct

    作用: 用于指定初始化方法。

    @PreDestroy

    作用: 用于指定销毁方法。

    ==============新注解=====

    @Configuration

    作用:用于指定当前类是一个 spring 配置类,当创建容器时会从该类上加载注解。获取容器时需要使用annotationApplicationContext(有@Configuration 注解的类.class)。

    属性:value:用于指定配置类的字节码

    @ComponentScan

    作用:用于指定 spring 在初始化容器时要扫描的包。作用和在 spring 的 xml 配置文件中的:是一样的。

     属性: basePackages:用于指定要扫描的包。和该注解中的 value 属性作用一样。 示例代码:

    @Bean

    作用: 该注解只能写在方法上,表明使用此方法创建一个对象,并且放入 spring 容器。

    属性: name:给当前@Bean 注解方法创建的对象指定一个名称(即 bean 的 id)。

    @PropertySource

    作用:用于加载.properties 文件中的配置。例如我们配置数据源时,可以把连接数据库的信息写到 properties 配置文件中,就可以使用此注解指定 properties 配置文件的位置。

    属性: value[]:用于指定 properties 文件位置。如果是在类路径下,需要写上 classpath:

    ===========Spring 注解和 XML 的选择问题=============

    注解的优势:

    配置简单,维护方便(我们找到类,就相当于找到了对应的配置)。

    XML 的优势: 修改时,不用改源码。不涉及重新编译和部署。

    Spring 管理 Bean 方式的比较:


    相关文章

      网友评论

          本文标题:18-Spring_基于 XML 的配置和依赖注解

          本文链接:https://www.haomeiwen.com/subject/iwzvjctx.html