Spring 中的 IoC 配置


一、常用的 IoC 注解及分类

  • 曾经XML的配置:
<bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl"
       scope=""  init-method="" destroy-method="">
      <property name=""  value="" | ref=""></property>
</bean>

1. 用于创建对象的

他们的作用就和在XML配置文件中编写一个标签实现的功能是一样的;

@Component

  • 作用:用于把当前类对象存入spring容器中;
  • 属性:value:用于指定bean的id。当我们不写时,它的默认值是当前类名,且首字母改小写;

Controller:一般用在表现层;
Service:一般用在业务层;
Repository:一般用在持久层;

  • 以上三个注解他们的作用和属性与Component是一模一样;
  • 他们三个是spring框架为我们提供明确的三层使用的注解,使我们的三层对象更加清晰;

2. 用于注入数据的

他们的作用就和在xml配置文件中的bean标签中写一个标签的作用是一样的;

Autowired

  • 作用:自动按照类型注入。只要容器中有唯一的一个bean对象类型和要注入的变量类型匹配,就可以注入成功;
  • 如果ioc容器中 没有任何bean的类型和要注入的变量类型匹配,则报错。
  • 如果Ioc容器中 有多个类型匹配时:
    出现位置:可以是变量上,也可以是方法上
  • 细节:在使用注解注入时,set方法就不是必须的了。

Qualifier

  • 作用:在按照类中注入的基础之上再按照名称注入。它在给类成员注入时不能单独使用,但是在给方法参数注入时可以;
  • 属性:value:用于指定注入bean的id。

Resource

  • 作用:直接按照bean的id注入。它可以独立使用;
  • 属性:name:用于指定bean的id。

注意

  • 以上三个注入都只能注入其他bean类型的数据;
  • 而基本类型和String类型无法使用上述注解实现。
  • 另外,集合类型的注入只能通过XML来实现。

Value

  • 作用:用于注入基本类型和String类型的数据;
  • 属性:value:用于指定数据的值。它可以使用spring中SpEL(也就是spring的el表达式)
    SpEL的写法:${表达式}

3. 用于改变作用范围的

他们的作用就和在bean标签中使用scope属性实现的功能是一样的;

Scope

  • 作用:用于指定bean的作用范围
  • 属性:value:指定范围的取值。
    常用取值:singleton、prototype;

4. 和生命周期相关

他们的作用就和在bean标签中使用init-method和destroy-methode的作用是一样的;

PreDestroy

  • 作用:用于指定销毁方法

PostConstruct

  • 作用:用于指定初始化方法

在这里插入图片描述

二、基于 xml 的 IoC 配置

bean.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">
    <!-- 配置Service -->
    <bean id="accountService" class="com.service.AccountServiceImpl">
        <!-- 注入dao -->
        <property name="accountDao" ref="accountDao"></property>
    </bean>

    <!--配置Dao对象-->
    <bean id="accountDao" class="com.dao.AccountDaoImpl">
        <!-- 注入QueryRunner -->
        <property name="runner" ref="runner"></property>
    </bean>

    <!--配置QueryRunner-->
    <bean id="runner" class="org.apache.commons.dbutils.QueryRunner" scope="prototype">
        <!--注入数据源-->
        <constructor-arg name="ds" ref="dataSource"></constructor-arg>
    </bean>

    <!-- 配置数据源 -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <!--连接数据库的必备信息-->
        <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
        <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/mybatisdata?useUnicode=true&amp;useJDBCCompliantTimezoneShift=true&amp;useLegacyDatetimeCode=false&amp;serverTimezone=UTC"></property>
        <property name="user" value="root"></property>
        <property name="password" value="root"></property>
    </bean>
</beans>

三、基于 注解 的 IoC 配置

1. 配置文件

(1)配置文件 SpringConfiguration.java 内容如下:
(该类是一个配置类,它的作用和 bean.xml 是一样的)

@ComponentScan("com")
@Import(JdbcConfig.class)
@PropertySource("classpath:jdbcConfig.properties")
public class SpringConfiguration {
    
    

}

(2)配置文件 JdbcConfig.java 内容如下:
(该类是一个配置类,它是一个和 Spring 连接数据库相关的类)

package config;

import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.apache.commons.dbutils.QueryRunner;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Scope;

import javax.sql.DataSource;

/**
 * 和spring连接数据库相关的配置类
 */
public class JdbcConfig {
    
    

    @Value("${jdbc.driver}")
    private String driver;

    @Value("${jdbc.url}")
    private String url;

    @Value("${jdbc.username}")
    private String username;

    @Value("${jdbc.password}")
    private String password;

    /**
     * 用于创建一个QueryRunner对象
     * @param dataSource
     * @return
     */
    @Bean(name="runner")
    @Scope("prototype")
    public QueryRunner createQueryRunner(@Qualifier("ds2") DataSource dataSource){
    
    
        return new QueryRunner(dataSource);
    }

    /**
     * 创建数据源对象
     * @return
     */
    @Bean(name="ds2")
    public DataSource createDataSource(){
    
    
        try {
    
    
            ComboPooledDataSource ds = new ComboPooledDataSource();
            ds.setDriverClass(driver);
            ds.setJdbcUrl(url);
            ds.setUser(username);
            ds.setPassword(password);
            return ds;
        }catch (Exception e){
    
    
            throw new RuntimeException(e);
        }
    }

    @Bean(name="ds1")
    public DataSource createDataSource1(){
    
    
        try {
    
    
            ComboPooledDataSource ds = new ComboPooledDataSource();
            ds.setDriverClass(driver);
            ds.setJdbcUrl("jdbc:mysql://localhost:3306/mybatisdata?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC");
            ds.setUser(username);
            ds.setPassword(password);
            return ds;
        }catch (Exception e){
    
    
            throw new RuntimeException(e);
        }
    }
}

2. spring中的新注解

Configuration

  • 作用:指定当前类是一个配置类
  • 细节:当配置类作为 AnnotationConfigApplicationContext 对象创建的参数时,该注解可以不写。

ComponentScan

  • 作用:用于通过注解指定spring在创建容器时要扫描的包
  • 属性:value:它和 basePackages 的作用是一样的,都是用于指定创建容器时要扫描的包。
    我们使用此注解就等同于在 xml 中配置了:
<context:component-scan base-package="com.itheima"></context:component-scan>

Bean

  • 作用:用于把当前方法的返回值作为 bean 对象存入 spring 的 ioc 容器中
  • 属性:name:用于指定 bean 的 id 。当不写时,默认值是当前方法的名称
  • 细节:当我们使用注解配置方法时,如果方法有参数,spring框架会去容器中查找有没有可用的 bean 对象。
    查找的方式和 Autowired 注解的作用是一样的

Import

  • 作用:用于导入其他的配置类
  • 属性:value:用于指定其他配置类的字节码。
    当我们使用 Import 的注解之后,有 Import 注解的类就父配置类,而导入的都是子配置类

PropertySource

  • 作用:用于指定 properties 文件的位置
  • 属性:value:指定文件的名称和路径。
    关键字:classpath,表示类路径下

四、基于 xml 和 注解 的配置

五、测试代码

代码链接如下:
基于 xml :代码
基于 注解:代码

猜你喜欢

转载自blog.csdn.net/pary__for/article/details/112211949