Spring -- IOC 基础应用

2021-02-16  本文已影响0人  Travis_Wu

一、启动 IOC 容器的方式

二、BeanFactory 与 ApplicationContext 区别

三、 纯 XML 模式

3.1 引入相关依赖

<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
    https://www.springframework.org/schema/beans/spring-beans.xsd">
<!--引入Spring IoC容器功能-->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context</artifactId>
  <version>5.1.12.RELEASE</version>
</dependency>

<!--引入spring web功能-->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-web</artifactId>
  <version>5.1.12.RELEASE</version>
</dependency>

3.2 启动 IOC 容器

// JavaSE方式启动
public class IoCTest {
    @Test
    public void testIoC() throws Exception {
        // 通过读取classpath下的xml文件来启动容器(xml模式SE应用下推荐)
        ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
        // 不推荐使用
        //ApplicationContext applicationContext1 = new FileSystemXmlApplicationContext("文件系统的绝对路径");
        AccountDao accountDao = (AccountDao) applicationContext.getBean("accountDao");
        System.out.println("accountDao:" + accountDao);
   }
}
private TransferService transferService = null ;
// web 方式启动
@Override
public void init() throws ServletException {
    WebApplicationContext webApplicationContext = WebApplicationContextUtils.getWebApplicationContext(this.getServletContext());
    transferService = (TransferService) webApplicationContext.getBean("transferService");
}
<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
    <display-name>Archetype Created Web Application</display-name>
    <!--配置Spring ioc容器的配置文件-->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>
    <!--使用监听器启动Spring的IOC容器-->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
</web-app>

3.3 实例化 Bean 的三种方式

3.4 Bean 的作用范围及生命周期

3.5 Bean 标签属性

在基于 xml 的 IOC 配置中,bean 标签是最基础的标签,它表示了 IOC 容器中的⼀个对象,换句话说,如果⼀个对象想让 Spring 管理,在 XML 的配置中都需要使用此标签配置,Bean标签的属性如下:

3.6 DI 依赖注入的 xml 配置

public class JdbcAccountDaoImpl implements AccountDao {

    private ConnectionUtils connectionUtils;
    private String name;
    private int sex;
    private float money;

    public void setConnectionUtils(ConnectionUtils connectionUtils) {
        this.connectionUtils = connectionUtils;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setSex(int sex) {
        this.sex = sex;
    }

    public void setMoney(float money) {
        this.money = money;
    }

    public JdbcAccountDaoImpl(ConnectionUtils connectionUtils, String name, int sex, float money) {
        this.connectionUtils = connectionUtils;
        this.name = name;
        this.sex = sex;
        this.money = money;
    }

    private String[] myArray;
    private Map<String,String> myMap;
    private Set<String> mySet;
    private Properties myProperties;

    public void setMyArray(String[] myArray) {
        this.myArray = myArray;
    }

    public void setMyMap(Map<String, String> myMap) {
        this.myMap = myMap;
    }

    public void setMySet(Set<String> mySet) {
        this.mySet = mySet;
    }

    public void setMyProperties(Properties myProperties) {
        this.myProperties = myProperties;
    }
}
<bean id="accountDao" class="com.wujun.edu.dao.impl.JdbcTemplateDaoImpl" scope="singleton" init-method="init" destroy-method="destory">
        
        <!--set注入使用property标签,如果注入的是另外一个bean那么使用ref属性,如果注入的是普通值那么使用的是value属性-->
        <property name="ConnectionUtils" ref="connectionUtils"/>
        <property name="name" value="zhangsan"/>
        <property name="sex" value="1"/>
        <property name="money" value="100.3"/>

        <constructor-arg index="0" ref="connectionUtils"/>
        <constructor-arg index="1" value="zhangsan"/>
        <constructor-arg index="2" value="1"/>
        <constructor-arg index="3" value="100.5"/>

        <!--name:按照参数名称注入,index按照参数索引位置注入-->
        <constructor-arg name="connectionUtils" ref="connectionUtils"/>
        <constructor-arg name="name" value="zhangsan"/>
        <constructor-arg name="sex" value="1"/>
        <constructor-arg name="money" value="100.6"/>

        <!--set注入注入复杂数据类型-->
        <property name="myArray">
            <array>
                <value>array1</value>
                <value>array2</value>
                <value>array3</value>
            </array>
        </property>

        <property name="myMap">
            <map>
                <entry key="key1" value="value1"/>
                <entry key="key2" value="value2"/>
            </map>
        </property>

        <property name="mySet">
            <set>
                <value>set1</value>
                <value>set2</value>
            </set>
        </property>

        <property name="myProperties">
            <props>
                <prop key="prop1">value1</prop>
                <prop key="prop2">value2</prop>
            </props>
        </property>

    </bean>

四、 XML与注解相结合模式

4.1 注意

4.2 xml 中标签与注解的对应(IOC)

xml 形式 对应的注解形式
标签 (1)@Component("accountDao"),注解加在类上
(2)bean 的 id 属性内容直接配置在注解后面如果不配置,默认定义个这个 bean 的 id 为类的类名首字母小写
(3)针对分层代码开发提供了 @Componenet 的三种别名 @Controller、@Service、@Repository 分别用于控制层类、服务层类、dao层类的 bean 定义,这四个注解的用法完全⼀样,只是为了更清晰的区分而已
标签的 scope 属性 @Scope("prototype"),默认单例,注解加在类上
标签的 init-method 属性 @PostConstruct,注解加在方法上,该方法就是初始化后调用的方法
标签的 destory-method 属性 @PreDestory,注解加在方法上,该方法就是销毁前调用的方法

4.3 DI 依赖注入的注解实现方式

五、纯注解模式

改造 xml + 注解模式,将 xml 中遗留的内容全部以注解的形式迁移出去,最终删除xml,从 Java 配置类启动
对应注解
@Configuration 注解,表名当前类是⼀个配置类
@ComponentScan 注解,替代 context:component-scan
@PropertySource,引入外部属性配置文件
@Import 引入其他配置类
@Value 对变量赋值,可以直接赋值,也可以使用 ${} 读取资源配置文件中的信息
@Bean 将方法返回对象加入 SpringIOC 容器

上一篇 下一篇

猜你喜欢

热点阅读