Spring基于XML的基础使用

在软件工程中,耦合指的就是就是对象之间的依赖性。对象之间的耦合越高,维护成本越高。因此对象的设计应使类和构件之间的耦合最小。软件设计中通常用耦合度和内聚度作为衡量模块独立程度的标准。划分模块的一个准则就是高内聚低耦合。

ioc 的作用:
削减计算机程序的耦合(解除我们代码中的依赖关系)。减少代码中new出对象的存在,使用工厂模式减少耦合。

程序的耦合
耦合:程序间的依赖关系
包括:
类之间的依赖
方法间的依赖
解耦:
降低程序间的依赖关系
实际开发中:
应该做到:编译期不依赖,运行时才依赖。
解耦的思路:
第一步:使用反射来创建对象,而避免使用new关键字。
第二步:通过读取配置文件来获取要创建的对象全限定类名

给xml文件添加约束

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 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">
</beans>

使用工厂创建对象

   //直接加载,一般用于单例
            ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
            AccountService bean = ac.getBean("AccountService", AccountService.class);
            //创建前先在XML文件上配置<bean id="AccountService  class="com.i.service.AccountService></bean>
            
            bean.saveAccount();

            AccountDao dao = ac.getBean("AccountDao", AccountDao.class);
            dao.saveAccount();


        //延迟加载,一般用在多例
        Resource resource = new ClassPathResource("bean.xml");
        BeanFactory factory = new XmlBeanFactory(resource);
        User user= factory.getBean("User", User.class);

BeanFactory 和 ApplicationContext 的区别:
创建对象的时间点不一样。
ApplicationContext:只要一读取配置文件,默认情况下就会创建对象。
BeanFactory:什么使用什么时候创建对象。

XML的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:指定类中销毁方法名称。

单例对象:scope=“singleton”
一个应用只有一个对象的实例。它的作用范围就是整个引用。
生命周期:
对象出生:当应用加载,创建容器时,对象就被创建了。
对象活着:只要容器在,对象一直活着。
对象死亡:当应用卸载,销毁容器时,对象就被销毁了。

多例对象:scope=“prototype”
每次访问对象时,都会重新创建对象实例。
生命周期:
对象出生:当使用对象时,创建新的对象实例。
对象活着:只要对象在使用中,就一直活着。
对象死亡:当对象长时间不用时,被 java 的垃圾回收器回收了。

spring 的依赖注入
1.构造函数注入

<!-- 使用构造函数的方式,给 service 中的属性传值
要求:
类中需要提供一个对应参数列表的构造函数。
涉及的标签:
constructor-arg
属性:
index:指定参数在构造函数参数列表的索引位置
type:指定参数在构造函数中的数据类型
name:指定参数在构造函数中的名称 用这个找给谁赋值
=======上面三个都是找给谁赋值,下面两个指的是赋什么值的==============
value:它能赋的值是基本数据类型和 String 类型
ref:它能赋的值是其他 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 方法注入

<bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl"> <property name="name" value="test"></property> 
<property name="age" value="21"></property> 
<property name="birthday" ref="now"></property>
</bean> <bean id="now" class="java.util.Date"></bean>

集合方式注入

<!-- 注入集合数据
List 结构的:array,list,set
Map 结构的map,entry,props,prop--> 

<bean id="accountService" class="com.i.service.impl.AccountServiceImpl">
<!-- 在注入集合数据时,只要结构相同,标签可以互换 -->
<!-- 给数组注入数据 --> <property name="myStrs">
 <set><value>AAA</value> 
 <value>BBB</value> 
 <value>CCC</value>
</set>
</property>

<!-- 注入 list 集合数据 --> <property name="myList"> <array>
 <value>AAA</value> <value>BBB</value>
  <value>CCC</value>
</array>
</property>

<!-- 注入 set 集合数据 --> <property name="mySet"> <list><value>AAA</value> <value>BBB</value> <value>CCC</value>
</list>
</property>

<!-- 注入 Map 数据 --> <property name="myMap">
 <props>
  <prop key="testA">aaa</prop> 
  <prop key="testB">bbb</prop>
</props>
</property>

<!-- 注入 properties 数据 -->
<property name="myProps">
 <map>
 <entry key="testA" value="aaa"></entry> 
 <entry key="testB"> <value>bbb</value></entry>
</map>
</property>


</bean>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值