JAVA-第十部分-Spring-Context

758 阅读2分钟

写在前面

Spring-context

  • spring容器
  • 通过配置pom文件的方式简化代码开发
  • 命名空间,简化配置,可以用命名空间的上下文作为标签属性;p空间对象依赖注入;context空间引用Spring模块功能

基本开发步骤

  • web框架的maven导入spring
  • 创建spring版本的applicationContex.xml
<bean id="userDao" class="com.test.impl.UserDaoImpl"></bean>
  • 调用
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao = (UserDao) app.getBean("userDao");
userDao.save();

Bean

<bean id="userDao" class="con.java.impl.UserDaoImpl" scope="singleton" init-method="init" destroy-method="dealloc" ></bean>
  • id,Bean实例在Spring容器中的唯一标识
  • class,类的全限定名称
  • scope,对象的作用范围;singleton创建一个,加载配置文件的时候对象就被创建,当应用卸载,销毁容器时,对象被销毁;prototype创建多个,每次getBean时创建,长时间不用时被垃圾回收,同正常的对象使用 image.png
  • init-method 初始化方法名称
  • destroy-method 指定销毁方法名称
  • 手动关闭容器
(ClassPathXmlApplicationContext)app.close();

实例化对象

  • 默认找的无参构造进行创建
  • 指定调用工厂的静态方法
<bean id="userDao" class="com.java.demo.factory.StaticFactory" factory-method="getUserDao"></bean>
  • 指定调用工厂的普通对象方法
<bean id="factory" class="com.java.demo.factory.DynamicFactory"></bean>
<bean id="userDao" factory-bean="factory" factory-method="getUserDao"></bean>

依赖注入

  • 对象调用,可以注入普通数据、引用数据、集合数据
  • 通过框架将持久层对象传入业务层
  • set方法注入
<bean id="userDao" class="con.java.impl.UserDaoImpl"></bean>
<bean id="userService" class="com.java.demo.service.impl.UserServiceImpl">
    <!--userService内部的userDao属性对应的是上面的userDao对象-->
    <property name="userDao" ref="userDao"></property>
</bean>

//服务层代码
private UserDao userDao;

public void setUserDao(UserDao userDao) {
    this.userDao = userDao;
}
  • p命名空间
<!--配置-->
xmlns:p="http://www.springframework.org/schema/p"

<bean id="userService" class="com.java.demo.service.impl.UserServiceImpl" p:userDao-ref="userDao"/>
  • 构造注入
<bean id="userDao" class="con.java.impl.UserDaoImpl"></bean>
<bean id="userService" class="com.java.demo.service.impl.UserServiceImpl">
    <!--name为有参构造的属性名,ref为传进去属性-->
    <constructor-arg name="userDao" ref="userDao"></constructor-arg>
</bean>

//服务层代码
private UserDao userDao;
public UserServiceImpl(UserDao userDao) {
    this.userDao = userDao;
}
  • 普通属性注入
<property name="username" value="zhangsan"></property>
<property name="age" value="18"></property>
  • 集合注入,集合中包括属性
<property name="stringList">
    <list>
        <value>zhangsan</value>
        <value>lisi</value>
        <value>wangwu</value>
    </list>
</property>
<property name="userMap">
    <map>
        <entry key="u1" value-ref="user1"></entry>
        <entry key="u2" value-ref="user2"></entry>
    </map>
</property>
<property name="properties">
    <props>
        <prop key="p1">ooo1</prop>
        <prop key="p2">pppp3</prop>
    </props>
</property>

<!--map-value-->
<bean id="user1" class="con.mzx.impl.User">
    <property name="name" value="zhaoliu"></property>
    <property name="age" value="20"></property>
</bean>
<bean id="user2" class="con.mzx.impl.User">
    <property name="name" value="zhiadaw"></property>
    <property name="age" value="17"></property>
</bean>

配置拆解

  • 将配置文件拆解成多个文件
<import resource="applicationContext-user.xml"/>

相关API

ApplicationContext

  • ClassPathXmlApplicationContext,从类的跟路径加载配置文件
ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
  • FileSystemXmlApplicationContext,磁盘地址
  • AnnotationConfigApplicationContext,使用注解配置容器对象时,通过此类

getBean

  • 通过字符串获取,通过唯一的id获取
  • 通过字节码获取,如果只有一个类,可以使用,不用通过强转
classPathXmlApplicationContext.getBean(UserService.class);