文章目录
- 常用注解详解
- 1.用于创建对象的注解
- 作用:
- 示例:
- 理解:
- 2.用于注入数据的注解(实现依赖注入)
- ① `@Autowired`:
- ②`@Resource`:
- ③`@Value`:
- 3.用于改变Bean作用范围的注解:
- 4.与Bean生命周期相关的注解
- xml配置和注解组合使用注意事项
- Spring纯注解配置,使用配置类,替换xml配置
- 通过纯注解配置如何获取容器
- Spring整合Junit,Spring测试框架
常用注解详解
1.用于创建对象的注解
@Controller:一般用于表现层的注解。
@Service:一般用于业务层的注解。
@Repository:一般用于持久层的注解。
@Component:所有类都可用。
作用:
相当于在xml中配置一个bean,创建一个对象的实例,并存入SpringIOC容器中,给SpringIOC容器管理。
示例:
@Service(value = "userService")//默认value值是userServiceImpl
//value属性:相当于xml配置中指定bean的id,如果不指定value属性,默认是当前类首字母小写的类名。 可以理解为在容器中要通过该标识才能找到该对象
public class UserServiceImpl implements UserService {
public void add(User user) {
userDao.add(user);
}
}
理解:
//注解
@Service(value = "userService")
//相当于xml配置文件配置了一个bean
<bean id="userService" class="com.mycode.service.impl.UserServiceImpl" />
//相当于java代码
UserService userService= new com.mycode.service.impl.UserServiceImpl();
2.用于注入数据的注解(实现依赖注入)
- 理解
//用于注入数据的注解
//相当于xml配置文件配置
<property name="" ref=""> 或 <property name="" value="">
① @Autowired
:
- 作用:默认自动按照类型注入,当使用注解注入属性时,set方法可以省略(用xml配置需要该类提供set方法),只能注入其他bean类型。
- 注意: 当有多个类型匹配时,使用时要使用
@Qualifier(value = "创建对象的注解的属性value值")
指定当前属性需要注入的对象的名字,在spring容器查找,找到了则注入成功,找不到则报错。
@Repository(value = "userDao1")
public class UserDao1Impl implements UserDao {
}
@Repository(value = "userDao2")
public class UserDao2Impl implements UserDao {
}
public class UserServiceImpl implements UserService {
@Autowired
@Qualifier(value = "userDao1")
/*@Qualifier: 和@Autowired一起结合使用,在属性上不能单独使用,
指定当前属性需要注入的对象的名字(创建对象的注解的属性value值,即(相当于)也是xml配置的bean的id值)*/
private UserDao userDao;
}
如果像这样有多个类型可以匹配,又不用@Qualifier指定注入那个类型,则报错:
No qualifying bean of type 'com.mycode.dao.UserDao' available: expected single matching bean but found 2: userDao2,userDao1
- 注入方式:默认根据类型注入,即找UserService 的实现类的Bean对象,将Bean对象赋值给该属性;如果根据类型注入方式注入失败,则根据名字(即创建对象的注解的属性value值)注入。
@Qualifier
:
- 作用: 在自动按照类型注入的基础之上,再按照Bean的id注入。在给字段(属性)注入时不能独立使用,必须和
@Autowire
一起使用;给方法参数注入时,可以独立使用。
②@Resource
:
- 作用:默认根据 创建对象的注解的value值(即也相当于xml配置Bean的id值)注入,只能注入其他bean类型。
- 示例:
public class UserServiceImpl implements UserService {
//直接按照bean的id注入
@Resource(name = "userDao2")
private UserDao userDao;
}
- 注入方式:默认根据名字注入,如果根据名字注入方式失败,则根据类型注入。
③@Value
:
- 作用:注入基本数据类型和String类型数据, 一般用于注入配置文件中的数据,如jdbc的配置文件。(参考:spring纯注解配置,使用配置类,替换xml配置)
3.用于改变Bean作用范围的注解:
@Scope
: 指定bean的作用范围。
- 示例:
@Scope(value = "singleton")
//value属性:指定对象的作用范围 singleton(单例) prototype(多例) request(一次请求) session(一次会话) globalsession
public class UserServiceImpl implements UserService {
}
- 理解:
//用于改变Bean作用范围的注解
//相当于xml配置文件配置
<bean id="" class="" scope="">
4.与Bean生命周期相关的注解
@PostConstruct
:指定类中的初始化方法名称,对象创建之后,调用该方法。
@PreDestroy
:指定类中销毁方法名称,容器销毁之前调用该方法。
- 注意:加入注解,要写对应的方法。
- 理解:
//与Bean生命周期相关的注解
//相当于xml配置文件配置
<bean id="" class="" init-method="对象创建之后调用的方法 方法名" destroy-method="对象销毁之前调用的方法 方法名" />
xml配置和注解组合使用注意事项
基于以上注解,xml配置和注解组合使用时,则需要在xml配置中加入以下配置
<!-- 配置spring创建容器时要扫描的包,扫描指定包的注解-
以下配值为扫描com.mycode下的所有包
->
<context:component-scan base-package="com.mycode" />
这样类中的注解才会有效,像在UserServiceImpl类使用创建对象的注解,而在配置文件中并无做以上配置,则在使用Spring容器获取该类实例化对象时报错:
信息: Loading XML bean definitions from class path resource [beans.xml]
NoSuchBeanDefinitionException: No bean named 'userServiceImpl' available
Spring纯注解配置,使用配置类,替换xml配置
以Spring集成DBUtils,基于xml配置的ioc实现业务层和持久层解耦中的xml配置文件,使用配置类替换xml配置来学习其他几个注解
- 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">
<!--配置spring创建容器时要扫描的包,扫描指定包的注解 -->
<context:component-scan base-package="com.mycode" />
<!--创建QueryRunner对象 -->
<bean id="queryRunner" class="org.apache.commons.dbutils.QueryRunner">
<!--使用类中的public QueryRunner(DataSource ds)构造函数给成员变量赋值 根据构造函数中参数的名字注入-->
<constructor-arg name="ds" ref="datasource"/>
</bean>
<!--创建数据源 DruidDataSource-->
<bean id="datasource" class="com.alibaba.druid.pool.DruidDataSource">
<!--调用类中的set方法实现注入功能 DruidDataSource类中提供了需要注入成员的set方法-->
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql:///spring" />
<property name="username" value="root" />
<property name="password" value="1998" />
</bean>
</beans>
@Configuration
:用于指定当前类是一个spring配置类(spring的配置类,相当于xml配置文件),当创建容器时会从该类上加载注解。
@ComponentScan
: 用于指定spring在初始化容器时要扫描的包。
@Bean
:写在方法上,表明使用此方法创建一个对象,并且放入spring容器。
@PropertySource
: 用于加载.properties文件中的配置。
@Import
:用于导入其他配置类,则被引入的配置类可以不用写@Configuration注解。 value属性:指定其他配置类的字节码。
- 示例(spring配置类)
@Configuration
/*@Configuration :用于指定当前类是一个spring配置类(相当于xml配置文件) */
@ComponentScan(value = {"com.mycode"})
/*@ComponentScan :用于指定spring在初始化容器时要扫描的包。
相当于xml配置文件中的:<context:component-scan base-package="com.mycode"/>
*/
@PropertySource(value = "classpath:druid.properties")
/*@PropertySource: 用于加载.properties文件中的配置。
(解决硬编码问题)配置数据源时,可以把连接数据库的信息写到properties配置文件中,使用此注解指定properties配置文件的位置。
如properties配置文件在类路径下,需要加上上classpath:
*/
public class SpringConfig {
@Value("${url}")
/*@Value:注入字符串和基本数据类型
*/
private String url;
@Value("${myusername}")
private String username;
@Value("${password}")
private String password;
@Value("${driverClassName}")
private String driverClassName;
//创建QueryRunner对象
@Bean
/* @Bean:使用此方法创建一个对象,将创建的对象(返回值)交给Spring容器管理。 注意:这注解只能写在方法上
① 创建的对象在Spring容器中的标识(相当于xml配置的bean的id):默认是方法名,则在其他类中引用是引用该方法名
也可使用name属性:给当前@Bean注解方法 创建的对象 指定一个名称(bean的id),则在其他类中引用的是我们指定的名称。
② 如果有方法形参,注入数据的注入方式: 默认根据类型注入,如果根据类型注入方式失败(有多个类型匹配),则根据名称注入。
*/
public QueryRunner createRunner(DruidDataSource dataSource){
QueryRunner queryRunner = new QueryRunner(dataSource);
return queryRunner;
}
//创建数据源对象
@Bean
public DruidDataSource createDruidDataSource(){
DruidDataSource druidDataSource = new com.alibaba.druid.pool.DruidDataSource();
druidDataSource.setUrl(url);
druidDataSource.setUsername(username);
druidDataSource.setPassword(password);
druidDataSource.setDriverClassName(driverClassName);
return druidDataSource;
}
}
- druid.properties(Druid数据库连接池的配置文件)
url=jdbc:mysql://127.0.0.1:3306/spring
myusername=root
password=root
driverClassName=com.mysql.jdbc.Driver
当配置文件中的用户名配置为username时报错: 百度:配置文件中 username 与 Mysql 关键字冲突(暂不明确)
报错信息:
create connection SQLException, url: jdbc:mysql://127.0.0.1:3306/spring, errorCode 1045, state 28000
java.sql.SQLException: Access denied for user '周炜'@'localhost' (using password: YES)
通过纯注解配置如何获取容器
//参数:配置类的字节码
ApplicationContext applicationContext= new AnnotationConfigApplicationContext(SpringConfig.class);
Spring整合Junit,Spring测试框架
- 引入依赖
<!--Spring测试包 封装了junit-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<!--spring5及以上版本要求单元测试junit版本要高于或等于4.12-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
- 测试类配置步骤
//1.使用@RunWith注解替换原有运行器
@RunWith(SpringJUnit4ClassRunner.class)
/*
2.使用@ContextConfiguration指定spring配置文件的位置
locations属性:用于指定配置文件的位置。类路径下,需要使用classpath:
例:@ContextConfiguration(locations= {"classpath:beans.xml"})
classes属性:当不使用xml配置时,用于指定spring配置类。
*/
@ContextConfiguration(classes = {SpringConfig.class})
public class SpringDBUtilsTest {
//3.使用@Autowired给测试类中的变量注入数据
@Autowired
private UserService userService;
@Test
public void SelectTest(){
User user = userService.getById(3);
System.out.println(user);
}
}
注:Spring测试类扩展了JUnit,spring框架提供了一个运行器,可以读取配置文件(或注解)来创建容器(即测试程序能自动创建spring容器,无须我们编码创建)。