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的实现类,所以基本用不上)
->
-
配置bean的作用范围
<bean scope=""></bean>
- @Scope("类型")
- singleton 单例【默认】
- prototype 多例
配置和生命周期相关的
<bean init-method="" destroy-method=""></bean>
- @PostConstruct
init-method=""
执行方法前 - @PreDestroy
destroy-method=""
方法执行结束后
- @Scope("类型")
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手动属性赋值
- @Autowired
- @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>