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

第一步:拷贝必备的 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 方式的比较:





最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,794评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,050评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,587评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,861评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,901评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,898评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,832评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,617评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,077评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,349评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,483评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,199评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,824评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,442评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,632评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,474评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,393评论 2 352

推荐阅读更多精彩内容