1.Spring注解方式
不需要在spring配置文件中定义bean标签,而是直接在需要spring管理的对象类型上加一个特定注解。
@Component(通用注解)
@Service(业务层注解)
@Reository(数据访问层)
@Controller(控制层)
查看代码可以看到,就是给通用注解 @Component 起别名。
1.1 spring的注解使用
①代码里面的特殊标记,使用注解可以完成特定功能;
②注解写法 @注解名(属性名 = 属性值)
③注解可以使用在类上面,方法上面和属性上面;
④使用注解时,对象属性可以没有setter。
1.2 spring注解需要的包
spring-beans
spring-context
spring-core
spring-aop
早些版本可能需要单独导入 spring-aop 。
1.3 注解使用过程
①导包,创建类;
②spring配置文件,引入约束(使用相应的标签会自动引入);
http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd
③配置注解扫描,一般写父级包名:
<context:component-scan base-package="com.entity">
</context:component-scan>
1.4 创建对象的注解
四个注解功能是一样的,只是为了让注解类本身的用途清晰。
1.5 创建对象特殊限制
@Scope(value = "singleton") 单例
@Scope(value = "prototype") 多例
@Lazy(value = false) 懒加载
@PostConstruct 初始化函数
@PreDestory 销毁函数
1.6 注入属性的注解
1.6.1 @Autowired
自动注入,根据类型(不是定义的变量名) 查找对应类型的对象;
当自动注入bean时,先根据类型去匹配,匹配到多个类型时,再按照属性名取匹配;如果匹配不到,则查看是否配置( required = true),如果没有配置或者配置的是true,就代表必须注入,就抛出异常。
@Autowired(required = false)
public Hobby hobby;
代码中的 Hobby 是一个抽象类,且没有被继承,如果没有配置(required = false),则会报异常:
No qualifying bean of type 'com.entity.Hobby' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
1.6.2 @Qualifier(value = "对象名")
用于 @AutoWired 自动装配时,如果有多个同类型对象,则需要用改注解指定注入 Bean的名称。
1.6.3 @Resource(name = "对象名")
使用对象名做依据进行注入,name属性是在类上的注解配置的名字,再按类型进行注入。
@Resource 相当于 @Autowired 也是用来进行自动化注入的;
@Resource 是 Java 自带的,@Autowired 是 spring 写好的。
@Resource(name = "cat",type = Department.class)
public Department department;
@Component("department")
public class Cat extends Pet{
@Override
public void show() {
System.out.println("一只猫!");
}
}
@Component("cat")
public class Department {
@Value("开发")
private String name;
@Override
public String toString() {
return "Department{" +
"name='" + name + '\'' +
'}';
}
@Resource的匹配顺序:
①没有属性设置时(@Resource),会按照 变量名 (department) 去匹配,此时会匹配到 Cat,但是类型错误,抛出异常;
②设置了name 属性(@Resource(name = "cat")),此时会按照 name 属性(cat)去匹配,可以匹配到 Department , 不会抛异常;
③ 设置了 name 和 type 属性(上述代码所示),如果 name 属性匹配到 bean(id 是唯一的,如 Cat 设置了 department 其他的就不能设置了) 但是类型不正确,会直接报错;如果 name 没有匹配上,会接着按照 变量名 department 去匹配,如果匹配不上才会按照类型 type 去匹配;
④ 只设置了 type 属性,相当于是 name 属性没有匹配上,会先按照 department 即变量名去匹配,如果此时匹配到了 Cat 会直接报错,匹配不上才会按照 type 去匹配。
1.6.4 @Value("值")
给属性设置值。
1.6.5 测试
@Component("xx")
@Scope(value = "prototype")
@Lazy(value = false)
public class Driver {
@Value("张三")
private String name;
@Autowired
private Car car;
@Autowired
@Qualifier(value = "dog")
public Pet pet;
@Autowired(required = false)
public Hobby hobby;
@Resource(type = Department.class)
public Department q;
@Override
public String toString() {
return "Driver{" +
"name='" + name + '\'' +
", car=" + car +
", pet=" + pet +
", hobby=" + hobby +
", department=" + q +
'}';
}
}
public abstract class Pet {
protected String name;
public void show(){
}
}
@Component
public class Cat extends Pet{
@Override
public void show() {
System.out.println("一只猫!");
}
}
@Component
public class Dog extends Pet{
@Override
public void show() {
System.out.println("一只狗");
}
}
public abstract class Hobby {
}
@Component
public class Car {
@Value("五菱")
private String name;
@Value("30")
private Integer price;
@Override
public String toString() {
return "Car{" +
"name='" + name + '\'' +
", price=" + price +
'}';
}
}
ApplicationContext ac = new ClassPathXmlApplicationContext("spring-1.xml");
Driver driver = ac.getBean("xx", Driver.class);
System.out.println(driver);
driver.pet.show();
2. Spring整合MyBatis
pom.xml 文件引入依赖:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.wen</groupId>
<artifactId>spring-mybatis</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<spring.version>5.3.14</spring.version>
<commons-dbcp.version>1.4</commons-dbcp.version>
<mybatis.version>3.4.6</mybatis.version>
<mybatis-spring.version>1.3.3</mybatis-spring.version>
<mysql-connector-java.version>8.0.11</mysql-connector-java.version>
</properties>
<dependencies>
<!--引入spring基础模块-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- dbcp 连接池-->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>${commons-dbcp.version}</version>
</dependency>
<!-- mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<!-- mysql驱动类 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql-connector-java.version}</version>
</dependency>
<!--mybatis spring 整合-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>${mybatis-spring.version}</version>
</dependency>
<!-- mybatis分页插件 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.3.0</version>
</dependency>
<!--mybatis通用mapper插件-->
<dependency>
<groupId>com.github.abel533</groupId>
<artifactId>mapper</artifactId>
<version>3.0.1</version>
</dependency>
</dependencies>
</project>
使用spring整合mybatis主要是通过spring管理mybatis的一下内容:
①数据库连接池配置;
②SqlSessionFactory对象;
③Mapper接口配置;
④插件配置也可以放到spring配置中。
spring配置:
<?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 https://www.springframework.org/schema/context/spring-context.xsd">
<!--引用数据库配置文件-->
<context:property-placeholder location="db.properties"/>
<!--配置数据库连接池-->
<bean id = "ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.userName}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!--定义bean来创建MyBatis的SqlSessionFactory对象-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--配置数据库连接池-->
<property name="dataSource" ref="ds"/>
<!--配置数据实体别名-->
<property name="typeAliasesPackage" value="com.entity"/>
<!--配置MyBatis主文件路径-->
<property name="configLocation" value="classpath:Mybatis-config.xml"/>
<!--配置mapper文件路径-->
<property name="mapperLocations" value="classpath:com/mapper/GoodsMapper.xml"/>
</bean>
<!--配置mapper接口扫描-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.mapper"/>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
</beans>
mybatis配置文件:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<!--日志-->
<setting name="logImpl" value="STDOUT_LOGGING"/>
<!--<setting name="logImpl" value="LOG4J"/>-->
<!--下划线转小驼峰-->
<setting name="mapUnderscoreToCamelCase" value="true"/>
<!--开启二级缓存-->
<setting name="cacheEnabled" value="true"/>
<!--配置懒加载-->
<setting name="lazyLoadingEnabled" value="false"/>
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<property name="offsetAsPageNum" value="true"/>
<!--配置数据库方言 4.0版本以后不用写-->
<!--<property name="helperDialect" value="mysql"/>-->
<!--是否做count查询-->
<property name="rowBoundsWithCount" value="true"/>
<!--合理化分页-->
<property name="reasonable" value="true"/>
</plugin>
<plugin interceptor="com.github.abel533.mapperhelper.MapperInterceptor">
<!--主键自增回写方法,默认值MYSQL -->
<!--<property name="IDENTITY" value="MYSQL" />-->
<!--通用Mapper默认接口,我们定义的Mapper需要实现该接口 -->
<property name="mappers" value="com.github.abel533.mapper.Mapper"/>
</plugin>
<!--<plugin interceptor="com.interceptor.MyPageInterceptor">
<property name="start" value="1"/>
<property name="end" value="3"/>
</plugin>-->
</plugins>
</configuration>
测试:
ApplicationContext ac = new ClassPathXmlApplicationContext("spring-mybatis.xml");
ac.getBean(GoodsMapper.class).goodsList().forEach(System.out::println);