一、注解概述
什么是注解:
- 格式:注解是代码特殊标记,格式为 @注解名称(属性名称=属性值,属性名称=属性值…)。
- 作用:作用在类、方法、属性上面。
- 目的:简化xml配置。
spring针对bean管理中创建对象提供的注解:
- @Component
- @Service
- @Controller
- @Repository
spring针对bean管理中注入属性提供的注解:
- @AutoWired 根据类型注入属性
- @Qualifier 根据属性名称注入属性
- @Resource 可根据名称,也可根据类型注入属性
- @Value 注入基本类型或内置引用类(比如String)
二、创建对象
为了与前面所学内容进行区分,我们新建一个项目spring5_demo1,从这章开始在新项目中演示。
(1)第一步:引入需要的jar包
在项目下创建目录lib,把之前的项目中的lib下的jar包全部复制过来,在我们的电脑上的spring-5.2.6.RELEASE-dist文件夹下的libs文件夹下找一个新的jar包spring-aop-5.2.6.RELEASE,也放入lib中。
导入jar资源:
- 在IDEA项目中,依次点击文件-项目结构-模块-依赖,然后点击+号。
- 找到刚刚复制进来的5个jar包的位置,选中它们,导入进来。
- 点击Apply(应用),再点OK就可以了。
(2)开启组件扫描
- 在src下创建bean.xml文件。
- 引入context名称空间:
<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">//添加
- 开启组件扫描,在xml的beans标签中配置:
<!--开启组件扫描-->
<context:component-scan base-package="com.wang"></context:component-scan>
(3)使用创建对象注解
- 在com.wang下创建包service。
- 再在service下创建类UserService,并加上相应的注解:
package com.wang.service;
import org.springframework.stereotype.Service;
//相当于xml中<bean id="userService" class=...></bean>
//注解的value属性可以省略不写,默认对象名就是首字母小写后的类名
//Component、Service、Controller、Repository四个注解使用任意一个就行
@Service(value="userService")
public class UserSerivce {
public void add(){
System.out.println("service add...");
}
}
(4)测试
- 在com.wang下创建包test。
- 在test下创建TestDemo类,执行方法:
package com.wang.test;
import com.wang.service.UserSerivce;
import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestDemo {
@Test
public void testUserService(){
ApplicationContext context=new ClassPathXmlApplicationContext("bean.xml");
UserSerivce userSerivce = context.getBean("userService", UserSerivce.class);
System.out.println(userSerivce);
userSerivce.add();
}
}
三、组件扫描配置
哪些扫描,哪些不扫描。看懂下面两个示例就行:
<!--配置组件扫描示例1
use-default-filters="false"表示使用自己配置的filter过滤器
到com.wang中只扫描用@Controller注解的类-->
<context:component-scan base-package="com.wang" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!--配置组件扫描示例2
没有use-default-filters属性,表示使用默认配置的filter过滤器
到com.wang中扫描所有内容,除了用@Controller注解的类-->
<context:component-scan base-package="com.wang">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
四、属性注解
前面已经说了,常用的注入属性的注解有下面三个:
- @AutoWired 根据类型注入属性
- @Qualifier 根据属性名称注入属性
- @Resource 可根据名称,也可根据类型注入属性
- @Value 注入基本类型或内置引用类(比如String)
我们先在com.wang下面新建一个dao包。
(1)@AutoWired
- 在dao下创建一个UserDao接口和对应的实现类UserDaoImpl,如下:
package com.wang.dao;
public interface UserDao {
void add();
}
@Repository//注意,注解写在实现类上而不是接口上
public class UserDaoImpl implements UserDao {
@Override
public void add() {
System.out.println("dao add...");
}
}
- 修改一下UserService类,如下:
package com.wang.service;
import com.wang.dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserSerivce {
@Autowired //根据类型注入
private UserDao userDao;
public void add(){
System.out.println("service add...");
userDao.add();
}
}
- 测试一下,测试代码没变化:
@Test
public void testUserService(){
ApplicationContext context=new ClassPathXmlApplicationContext("bean.xml");
UserSerivce userSerivce = context.getBean("userService", UserSerivce.class);
System.out.println(userSerivce);
userSerivce.add();
}
(2)@Qualifier
要和@AutoWired一起使用。
@Autowired //根据类型注入
@Qualifier(value="userDaoImpl") //根据名称注入,如果同类型的有多个,可以定位到一个
private UserDao userDao;
(3)@Resource
@Resource//根据类型进行注入
private UserDao userDao;
@Resource(name="userDaoImpl)//根据名称进行注入
private UserDao userDao;
(4)@Value
@Value(value="abc")
private String uname;
五、纯注解开发
可以不使用甚至删除xml配置文件。
(1)创建配置类
在com.wang下创建了config包,用来存放配置类SpringConfig(替代xml文件):
package com.wang.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration //作为配置类,替代xml文件
@ComponentScan(basePackages = {
"com.wang"}) //组件扫描配置
public class SpringConfig {
}
(2)编写测试类(和之前有所不同)
@Test
public void testUserService(){
ApplicationContext context=new AnnotationConfigApplicationContext(SpringConfig.class);
UserSerivce userSerivce = context.getBean("userService", UserSerivce.class);
System.out.println(userSerivce);
userSerivce.add();
}
其他的还是照旧。