不需要在spring配置文件中定义bean标签,而是直接在需要spring管理的对象类型上加一个特定注解。
@Component(通用注解)
@Service(业务层注解)
@Reository(数据访问层)
@Controller(控制层)

查看代码可以看到,就是给通用注解 @Component 起别名。
①代码里面的特殊标记,使用注解可以完成特定功能;
②注解写法 @注解名(属性名 = 属性值)
③注解可以使用在类上面,方法上面和属性上面;
④使用注解时,对象属性可以没有setter。
spring-beans
spring-context
spring-core
spring-aop
早些版本可能需要单独导入 spring-aop 。
①导包,创建类;
②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>
四个注解功能是一样的,只是为了让注解类本身的用途清晰。
@Scope(value = "singleton") 单例
@Scope(value = "prototype") 多例
@Lazy(value = false) 懒加载
@PostConstruct 初始化函数
@PreDestory 销毁函数
自动注入,根据类型(不是定义的变量名) 查找对应类型的对象;
当自动注入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)}
用于 @AutoWired 自动装配时,如果有多个同类型对象,则需要用改注解指定注入 Bean的名称。
使用对象名做依据进行注入,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 去匹配。
给属性设置值。
- @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();
pom.xml 文件引入依赖:
- "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.0modelVersion>
-
- <groupId>com.wengroupId>
- <artifactId>spring-mybatisartifactId>
- <version>1.0-SNAPSHOTversion>
-
- <properties>
- <maven.compiler.source>8maven.compiler.source>
- <maven.compiler.target>8maven.compiler.target>
- <spring.version>5.3.14spring.version>
- <commons-dbcp.version>1.4commons-dbcp.version>
- <mybatis.version>3.4.6mybatis.version>
- <mybatis-spring.version>1.3.3mybatis-spring.version>
- <mysql-connector-java.version>8.0.11mysql-connector-java.version>
- properties>
- <dependencies>
-
- <dependency>
- <groupId>org.springframeworkgroupId>
- <artifactId>spring-contextartifactId>
- <version>${spring.version}version>
- dependency>
- <dependency>
- <groupId>org.springframeworkgroupId>
- <artifactId>spring-jdbcartifactId>
- <version>${spring.version}version>
- dependency>
-
- <dependency>
- <groupId>commons-dbcpgroupId>
- <artifactId>commons-dbcpartifactId>
- <version>${commons-dbcp.version}version>
- dependency>
-
- <dependency>
- <groupId>org.mybatisgroupId>
- <artifactId>mybatisartifactId>
- <version>${mybatis.version}version>
- dependency>
-
- <dependency>
- <groupId>mysqlgroupId>
- <artifactId>mysql-connector-javaartifactId>
- <version>${mysql-connector-java.version}version>
- dependency>
-
- <dependency>
- <groupId>org.mybatisgroupId>
- <artifactId>mybatis-springartifactId>
- <version>${mybatis-spring.version}version>
- dependency>
-
- <dependency>
- <groupId>com.github.pagehelpergroupId>
- <artifactId>pagehelperartifactId>
- <version>5.3.0version>
- dependency>
-
- <dependency>
- <groupId>com.github.abel533groupId>
- <artifactId>mapperartifactId>
- <version>3.0.1version>
- dependency>
- dependencies>
- project>
使用spring整合mybatis主要是通过spring管理mybatis的一下内容:
①数据库连接池配置;
②SqlSessionFactory对象;
③Mapper接口配置;
④插件配置也可以放到spring配置中。
spring配置:
- "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 id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
-
- <property name="dataSource" ref="ds"/>
-
- <property name="typeAliasesPackage" value="com.entity"/>
-
- <property name="configLocation" value="classpath:Mybatis-config.xml"/>
-
- <property name="mapperLocations" value="classpath:com/mapper/GoodsMapper.xml"/>
- bean>
-
-
- <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
- <property name="basePackage" value="com.mapper"/>
- <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
- bean>
- beans>
mybatis配置文件:
- "1.0" encoding="UTF-8" ?>
- 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="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"/>
-
-
-
- <property name="rowBoundsWithCount" value="true"/>
-
- <property name="reasonable" value="true"/>
- plugin>
-
- <plugin interceptor="com.github.abel533.mapperhelper.MapperInterceptor">
-
-
-
- <property name="mappers" value="com.github.abel533.mapper.Mapper"/>
- plugin>
-
- plugins>
-
- configuration>
测试:
- ApplicationContext ac = new ClassPathXmlApplicationContext("spring-mybatis.xml");
- ac.getBean(GoodsMapper.class).goodsList().forEach(System.out::println);