spring-xml方式-di和ioc配置

说明

  • 仅仅是把以前的比较归类存档,不具备太大的参考价值
  • 而且是历史内容,可能出现过时能信息,
  • 主要参考 https://docs.spring.io/spring/docs/5.2.6.RELEASE/spring-framework-reference/core.html#beans-introduction

XML和注解结合方式

  • 这个是早期具体哪个版本不记得,需要在application.xml开启元注解才可以使用@Component…等注解
  1. 开启扫描
  2. 配置扫描那些包

自动装配配置

  • 注解方式开启IOC
<!-- 开启spring注解-->
<!-- 自动装配,扫描cn.lwb包下的注解-->
<context:component-scan base-package="cn.lwb" />
<!-- 开启spring注解  这个功能较弱-->
<context:annotation-config />
  • 自动扫描装配
<!-- 配置扫描所有 -->
<context:component-scan base-package="vip.xjdai.ioc.cc"/>

<!-- 配置扫描 cc -->
<context:component-scan base-package="vip.xjdai.ioc.cc">
  <!-- 排除Service,除了service都会扫描 -->
  <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service" />
</context:component-scan>

<!-- 配置扫描 aa和bb -->
<context:component-scan base-package="vip.xjdai.ioc.aa,vip.xjdai.ioc.bb" use-default-filters="false">
  <!-- 配置仅扫描Service -->
  <context:include-filter type="annotation" expression="org.springframework.stereotype.Service" />
</context:component-scan>

<!-- use-default-filters="false" 默认值是true
   如果配置了就仅仅扫描@Controller,
   如果不配置则会扫描@Component, @Repository, @Service等注解
-->
<context:component-scan base-package="vip.xjdai.ioc.controller" use-default-filters="false">
  <!-- 配置只扫描@Controller注解 -->
  <context:include-filter type="annotation"   expression="org.springframework.stereotype.Controller" />
</context:component-scan>

注解使用

@Component   表示当前类是配置类
@Controller  用于表现层的注解
@Service     用于业务层的注解
@Repository  用于持久层的注解
  • 注解属性 value 指定bean的id。如果不指定value属性,默认bean的id是当前类的类名。首字母小写。

生命周期

  • 简单说就是对象在spring容器(IOC容器)中的生命周期,也可以理解为对象在spring容器中的创建方式。

  • @Scope

    • prototype :表示多例
    • singleton:表示单例(默认值)
    • request
    • session

DI注入

  • 需要IOC环境,spring创建这个类的过程中。

    • spring将类的依赖的属性设置进去,把依赖的属性往注入到对象中。
  • 泛型注入

    • 如果是泛型注入的话只能用@Autowired
    • 泛型注入是spring4的新特性

形参注入

  • @Qualifier(“cat1”) –例子暂定

    • 定义在形参内, 用于获取spring容器中的对象

对象注入

  • @Autowired

    • 在容器中获取一个类型相同的进行注入,自动按照类型注入。当使用注解注入属性时,set方法可以省略。它只能注入其他bean类型。当有多个类型匹配时,使用要注入的对象变量名称作为bean的id,在spring容器查找,找到了也可以注入成功。找不到就报错。
  • @Resource(name = “容器中name值”)

    • 直接按照Bean的id注入。它只能注入其他bean类型。如果该接口只有一个实现类,则不需要指定手动指定将,那个对象装入属性中
  • @Autowired

  • @Qualifier(“cat1”)

    • 在自动按照类型注入的基础之上,再按照Bean的id注入。它不能独立使用,必须和@Autowire一起使用。多相同的对象,指定容器中某一个自动匹配,spring,会自动查找容器中类型符合的对象,注入到属性当中

XML 纯配置

  • XML 配置是纯XML的配置,不依托于@注解的方式

XML-注入bean

  • 通过简单的配置,就可以将一个类的对象创建交给class管理
<bean name="标示 "  class="当前类地址" />

XML-静态注入

  • 静态注入指的是静态属性的注入
<bean id="dsForRW" class="cn.lwb.controller.AdvancedDatastore" />

<!--
init-method='init'     用于指定那个方法是初始化方法,将在对象创建之后调用
-->
<bean id="mongoFileOperationUtil" class="cn.lwb.controller.MongoFileOperationUtil" init-method="init">
  <property name="dsForRW" ref="dsForRW" />
</bean>
  • java 配置
public class MongoFileOperationUtil {

  private static AdvancedDatastore dsForRW;

  private static MongoFileOperationUtil mongoFileOperationUtil;

  public void init() {
      mongoFileOperationUtil = this;
      mongoFileOperationUtil.dsForRW = this.dsForRW;
  }

  public AdvancedDatastore getDsForRW() {
      return dsForRW;
  }

  public void setDsForRW(AdvancedDatastore dsForRW) {
      MongoFileOperationUtil.dsForRW = dsForRW;
  }

  public MongoFileOperationUtil getMongoFileOperationUtil() {
      return mongoFileOperationUtil;
  }

  public void setMongoFileOperationUtil(MongoFileOperationUtil mongoFileOperationUtil) {
      MongoFileOperationUtil.mongoFileOperationUtil = mongoFileOperationUtil;
  }

}

public class AdvancedDatastore {

  public static String getStringNaem() {
      return "你好";
  }
}

静态工厂注入

  • 根据构造方法的方式 静态工厂方式
<!--配置bean,配置后该类由spring管理 -->
<bean name="springAction2" class="cn.lwb.static_factory_di.SpringAction">
  <!--(3)使用静态工厂的方法注入对象,对应下面的配置文件(3) -->
  <property name="staticFactoryDao" ref="staticFactoryDao"></property>
</bean>
<!--(3)此处获取对象的方式是从工厂类中获取静态方法 -->
<bean name="staticFactoryDao" class="cn.lwb.static_factory_di.DaoFactory" factory-method="getStaticFactoryDaoImpl"></bean>
  • 生成对象的静态工厂
public class DaoFactory {
  //静态工厂
  public static final FactoryDao getStaticFactoryDaoImpl() {
      return new StaticFacotryDaoImpl();
  }
}
  • 需要生产的对象
public interface FactoryDao {
  public void saveFactory();

}
// 这个是一个实现类
public class StaticFacotryDaoImpl implements FactoryDao {
  @Override
  public void saveFactory() {
      System.out.println("我是一个对象"+this);
  }
}
  • 进行注入
public class SpringAction {
  //注入对象
  private FactoryDao staticFactoryDao;

  public void staticFactoryOk() {
      staticFactoryDao.saveFactory();
  }
  //注入对象的set方法
  public void setStaticFactoryDao(FactoryDao staticFactoryDao) {
      this.staticFactoryDao = staticFactoryDao;
  }
}

XML配置Bean一些标签属性

  • id
    • 给对象在容器提供一个唯一表示,与name功能一模一样.
    • 唯一性,如果ID 相同则覆盖
  • name
    • 给容器中的对象起个名字,在获得对象时根据对象名字获取对象
  • class
    • 需要被管理的类的全限定类名
  • scope
    • 表示声明周期
    • singleton:单例(默认每次启动容器时,对象就被创建只要容器在就存在容器关闭才会销毁
    • prototype:多例启动容器时,不会创建多例对象,每次获得对象时,都会创建新的对象当对象长时间不用时,被java的垃圾回收器回收了
    • request: web环境下,容器中与当前request同生命周期
    • session: web环境下,容器中与当前session同生命周期
  • destroy-method
    • 用于指定那个方法是销毁.将在对象销毁之前调用

XML-使用set方式进行注入

  • 对象,属性使用set方式注入
<bean id="userService" class="cn.lwb.User">
  <!-- 回去调用set方法,然后注入一个属性-->
  <property name="name" value="小明" />
  <!-- 回去调用set方法,然后注入一个属性-->
  <property name="customer" ref="customerDao" />
</bean>
<bean id="customerDao" class="cn.lwb.CustomerDao" />

name :属性的参数
ref :能赋的值是其他bean类型,必须得是在容器(spring)中配置过的bean

  • java
class UserService {
  private String anem;
  private CustomerDao customerDao;

  public void setAnem(String anem) {
      this.anem = anem;
  }

  public void setCustomer(Customer customer) {
      this.customer = customer;
  }
  public void isOK(){
    customerDao.isOk();
  }
}

构造函数方式对象、属性赋值

  • 使用构造函数的方式进行对象属性赋值,如果设置角标,则必须按照角标的顺序,否则保存失败
<bean id="标识符" class="全限定类名">
  <constructor-arg index="2" name="属性" ref="引用" />
  <constructor-arg index="1" name="属性" value="" />
  <constructor-arg index="0" name="属性" value="" />
</bean>
<bean name="标识符" class="全限定类名"></bean>

index:

name :属性的参数
ref :能赋的值是其他bean类型,必须得是在容器(spring)中配置过的bean

value:对应属性的值

type:指定参数在构造函数中的数据类型

  • 如果没有角标可以不用考虑
<bean id="标识符" class="全限定类名">
  <constructor-arg name="属性" ref="引用" />
  <constructor-arg name="属性" value="" />
  <constructor-arg name="属性" value="" />
</bean>
<bean name="标识符" class="全限定类名"></bean>

数组参数注入

  • 在注入集合数据时,只要结构相同,标签可以互换
  • 给数组注入数据
  • 给Bean属性赋值
<bean id="user" class="cn.lwb.com.User">
  <!-- 给User类中的set这个属性创建的时候初始化一个AAA的值-->
 <property name="set">
     <set>
         <value>AAA</value>
     </set>
 </property>
 <property name="array">
     <set>
         <value>AAA</value>
     </set>
 </property>
 <property name="list">
     <set>
         <value>AAA</value>
     </set>
 </property>
<bean>

命名空间注入方式

  • 基本不用,有这种方式,真的需要还是去百度吧
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值