目录
一、拆分Spring配置文件 🌹
为什么要拆分Spring配置文件?
在实际应用里,随着应用规模的增加,系统中 Bean 数量也大量增加,导致配置文件非常庞大。为了避免这种情况的产生,提高配置文件的可读性与可维护性,可以将Spring 配置文件分解成多个配置文件。
拆分前:所有配置信息都在同一个配置文件中。
按层拆分:不同层分别创建配置文件。
- dao层就放跟dao层相关的配置
<?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:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" 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 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd "> <!-- 1、引入 properties 配置文件 --> <context:property-placeholder location="database.properties" /> <!-- 2、配置数据源 --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="${driver}" /> <property name="url" value="${url}" /> <property name="username" value="${name}" /> <property name="password" value="${pwd}" /> </bean> <!-- 3、创建SqlSessionFactory --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 绑定数据源 --> <property name="dataSource" ref="dataSource" /> <!-- 指定Mybatis配置文件路径 --> <property name="configLocation" value="mybatis-config.xml" /> </bean> <!-- 4、MapperScannerConfig 将指定包下的 Mapper 接口注册到 Spring 容器中。 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.cskt.mapper" /> </bean> </beans>
- service放service层相关的配置文件
<?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:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" 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 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd "> <!-- 5、注解实现依赖注入 --> <context:component-scan base-package="com.cskt.service" /> </beans>
二、自动装配 🍬
什么是自动装配?
自动装配就是会通过Spring的上下文为你找出相应依赖项的类,通俗的说就是Spring会在上下文中自动查找,并自动给Bean装配与其相关的属性!
spring中实现自动装配的方式有两种,一种是通过xml文件、一种是通过注解的方式。
手动装配
讲自动装配之前,我们先来说一下手动装配,手动装配又是什么?手动装配就是通过xml配置自己将bean中所关联的其他bean装配进去。用代码表示:
package com.cskt.service.impl;
import com.cskt.domain.User;
import com.cskt.mapper.UserMapper;
import com.cskt.service.UserService;
public class UserServiceImpl implements UserService {
//实例化所依赖的SysUserMapper对象
//重复的new对象 构造注入 就是解决Service 和 dao 的问题
private UserMapper userMapper;
//添加构造函数
public UserServiceImpl(UserMapper userMapper) {
this.userMapper = userMapper;
}
@Override
public int insert(User sysUser) {
int count = userMapper.insert(sysUser);
return count;
}
}
<!-- 构造注入 1、先把dooImpl 注入进来 2、在service 写一个构造函数依赖注入 -->
<bean id="userMapper" class="com.cskt.mapper.impl.UserMapperImpl"></bean>
<bean id="userService" class="com.cskt.service.impl.UserServiceImpl">
<constructor-arg ref="userMapper"></constructor-arg>
</bean>
在id=userService的bean中,我们给userService手动装配了与之相关联的userMapper,这就叫做手动装配。
注:那么有没有什么办法,我们可以不用去手动装配关联的bean,让spring帮我们自动把关联的bean装配进去呢?答案是肯定的。自动装配就可以帮助我们解决这个问题。实现自动装配有两种方式,一种是使用注解的方式、另一种是通过xml文件的方式。下面我们俩讲实现自动装配的两种方式。
自动装配
-
通过xml文件实现自动装配
我们只需要在xml配置文件中的bean标签中加入一个属性autowire即可,例如:
<bean id="userService"
class="cn.cvs.service.sysUser.SysUserServiceImpl" autowire="byName" />
使用autowire关键字声明bean的自动装配方式。其可选值为byName、byType、constructor,default,no;
Spring提供的4种自动装配类型
属性 | 说明 |
---|---|
no | 不使用自动装配。Bean的依赖关系必须通过property元素定义 |
byType | 根据属性类型自动装配 |
byName | 根据属性名自动装配 |
constructor | 与byType的方式类似,不同之处在它应用于构造器参数 |
- 通过注解实现自动装配
package com.cskt.mapper.impl;
import com.cskt.domain.User;
import com.cskt.mapper.UserMapper;
import org.springframework.stereotype.Repository;
@Repository //等效于 <bean id="userMapper" class="com.cskt.mapper.impl.UserMapperImpl" />
//如果变量名规范的话就可以不用加括号 ("userMapper")
public class UserMapperImpl implements UserMapper {
@Override
public int insert(User sysUser) {
//这里未实现完整的数据库操作,仅为说明原因
System.out.println("执行了新增的方法。。。。");
return 0;
}
}
package com.cskt.service.impl;
import com.cskt.domain.User;
import com.cskt.mapper.UserMapper;
import com.cskt.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
@Service("userService") /*等效于 <bean id="userService" class="com.cskt.service.impl.UserServiceImpl">
<constructor-arg ref="userMapper"></constructor-arg>
</bean> */
public class UserServiceImpl implements UserService {
//实例化所依赖的SysUserMapper对象
//重复的new对象 构造注入 就是解决Service 和 dao 的问题
@Autowired //自动装配 只要命名规范 就会自动装配
//@Qualifier("userMapper") //如果获取不到, 如果指定装配哪一个
private UserMapper userMapper;
@Override
public int insert(User sysUser) {
int count = userMapper.insert(sysUser);
return count;
}
}
<!-- 扫描包中注解标注的类,如果不加的话会导致注入不进去 -->
<context:component-scan base-package="com.cskt.mapper,com.cskt.service" />
使用注解呢,就不需要我们手动去编写配置文件了。它会自动给我们生成一个bean,只需要配置我们的扫描仪