spring之 注解ioc&依赖注入 & spring整合mybatis

0x01、IOC注解开发

两个步骤:

​ 1、使用注解

​ 2、配置包扫描

  • 1、添加依赖
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.0.2.RELEASE</version>
</dependency>
  • 2、使用@Component注解
import com.idea.service.UserService;
import org.springframework.stereotype.Component;

/*
	value属性就是id
	@Component(value = "userService") 可以去掉value
	@Component("userService")
*/
@Component(value = "userService")

// 等同于 在xml里面,<bean id="userService" class="具体的类">
public class UserServiceImpl implements UserService {
    @Override
    public String getName() {
        return "王五";
    }
}
  • 3、配置包扫描

在beans标签内部,使用context:component-scan ,让spring扫描该基础包下的所有子包注解

<context:component-scan base-package="com.idea"></context:component-scan>

用于改变作用范围的@scope

@scope

​ singleton: 单例(默认)

​ prototype:多例

​ @Scope注解用来描述类的作用范围的,默认值singleton。如同xml中bean标签的属性scope <bean scope=""/>.如果配置成多例的使用prototype。

@Scope("prototype")
@Component("accountService")
public class AccountServiceImpl implements AccountService {}

3.3和生命周期相关的【了解】

其他:

<!---
	1.在要进行IOC的类上添加注解:以下四个注解的作用是一样的,都可以给对象IOC
       不同的注解
        1、Component("id") 	 使用在除了三层结构的其他类上
  		2、Controller("id")   配置在表现出的各种Controller类上
		3、Service("id")      配置在业务层的各种Service类上
		4、Repository("id")   在持久层的各种Dao的实现类上(但Mybatis没有dao的实现类,所以基本用不上)
    
->
  1. 配置bean的作用范围 <bean scope=""></bean>

    • @Scope("类型")
      • singleton 单例【默认】
      • prototype 多例

    配置和生命周期相关的 <bean init-method="" destroy-method=""></bean>

    • @PostConstruct init-method="" 执行方法前
    • @PreDestroy destroy-method="" 方法执行结束后

0x02、注解进行依赖注入

1、环境

dao层暂且不写

首先我们需要进行IOC,来进行实例化对象,所以使用@Controller@Service注解

如果没有配置id的话,对象名获取的是当前类的首字母小写

  • UserController
import com.idea.service.UserService;
import org.springframework.stereotype.Controller;

@Controller
public class UserController {
    private UserService userService;
    public String getName(){
        //调用业务层的getName()方法
        return userService.getName();
    }
}
  • UserService
import com.idea.service.UserService;
import org.springframework.stereotype.Service;


@Service
public class UserServiceImpl implements UserService {
    @Override
    public String getName() {
        return "王五";
    }
}
  • springConfig.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"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
    <!--1. 配置包扫描-->
    <context:component-scan base-package="com.idea"></context:component-scan>
</beans>

2、使用注解注入属性

(一)、@Autowired注解进行属性注入

@Autowired :自动装配(如果spring的核心容器中,只有一个该类型的对象,则自动把那个对象注入)

如果此时多了一个service接口的实现类

  • UserServiceImplAuto
import com.idea.service.UserService;
import org.springframework.stereotype.Service;


@Service
public class UserServiceImpl implements UserService {
    @Override
    public String getName() {
        return "赵六";
    }
}

此时就会跟 UserServiceImpl产生冲突,进行报错

(二)、@Qualifier注解注入

这时候我们可以使用@Qualifier注解进行手动注入

  • UserController
import com.idea.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

@Controller
public class UserController {
    @Qualifier("UserServiceImplAuto")
    private UserService userService;
    public String getName(){
        //调用业务层的getName()方法
        return userService.getName();
    }
}

(三)、@Resource注解注入

@Resource注解:可以手动,也可以自动
				当实现类为一个的时候,可以自动
				当多个实现类的时候,可以像Qualifier手动属性赋值
  1. @Autowired
  2. @Qualifier

这两个注解是spring里面的

@Resource 是jdk里面的

0x03、spring整合Mybatis

  • 1、引入依赖
<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <!--spring-->
    <spring.version>5.0.2.RELEASE</spring.version>
    <!--日志打印框架-->
    <slf4j.version>1.6.6</slf4j.version>
    <log4j.version>1.2.12</log4j.version>
    <!--mysql-->
    <mysql.version>5.1.6</mysql.version>
    <!--mybatis-->
    <mybatis.version>3.5.3</mybatis.version>
</properties>

<dependencies>
    <!--引入依赖-->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <!--mysql依赖-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>${mysql.version}</version>
    </dependency>
    <!-- log start -->
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>${log4j.version}</version>
    </dependency>

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>${slf4j.version}</version>
    </dependency>

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>${slf4j.version}</version>
    </dependency>
    <!-- log end -->

    <!--mybatis的依赖-->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>${mybatis.version}</version>
    </dependency>

    <!--
          mybatis整合spring的依赖
        -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis-spring</artifactId>
        <version>1.3.0</version>
    </dependency>

    <!--lombok-->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.10</version>
    </dependency>

    <!--junit-->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.11</version>
        <scope>test</scope>
    </dependency>
</dependencies>

我们的重点是将创建的代理对象放到spring的核心容器中

  • springConfig.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"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
    <!-- 1. 包扫描 -->
    <context:component-scan base-package="com.idea"></context:component-scan>

    <!--
        2. spring整合mybatis
           配置jdbc的环境
            由spring配置dataSource(既可以使用spring内置的dataSource,又可以使用第三方的DataSource)
    -->
    <!-- 1、spring内置的DataSource -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="username" value="root"></property>
        <property name="password" value="root"></property>
        <property name="url" value="jdbc:mysql:///mybatis?characterEncoding=utf8"></property>
        <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
    </bean>
    <!-- 2、将SqlSessionFactoryBean 对象进行IOC配置到spring的核心容器中,并且将dataSource注入进去 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"></property>
        <!--别名配置的包扫描-->
        <property name="typeAliasesPackage" value="com.idea.pojo"></property>
    </bean>
    <!--
        3、扫描dao包,创建出dao的代理对象,交给spring的核心容器管理
            扫描完包,完成了实例化,那对象id是什么?
                就是接口名首字母改小写
    -->
    <bean id="scannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.idea.dao"></property>
    </bean>
</beans>

这时候mybatis的主配置文件直接不要了,已经整合到了spring

也不用执行原本这么复杂的代码了,直接缩短到短短的三行

@Test
    public void test01() throws IOException {
        //1. 加载主配置文件
        InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2. 创建SqlSessionFacyoryBuilder对象
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        //3. 构建出SqlSessionFactory对象
        SqlSessionFactory sessionFactory = builder.build(is);
        //4. 创建出Sqlsession对象
        SqlSession sqlSession = sessionFactory.openSession();
        //5. 创建UserDao接口的代理对象
        UserDao userDao = sqlSession.getMapper(UserDao.class);
        //6. 调用代理对象的方法
        List<User> userList = userDao.findAll();

        System.out.println(userList);

        //7. 关闭资源
        is.close();
        sqlSession.close();
    }

0x04、其他

引入外部的properties属性文件

实现

<context:property-placeholder location="classpath:jdbc.properties"/>

<!--1. 创建DataSource对象-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="username" value="${jdbc.username}"></property>
    <property name="password" value="${jdbc.password}"></property>
    <property name="url" value="${jdbc.url}"></property>
    <property name="driverClassName" value="${jdbc.driver}"></property>
</bean>
posted @ 2021-01-29 08:57  0X7e  阅读(256)  评论(0编辑  收藏  举报