美文网首页
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