Spring5----复习笔记3
今天来介绍一下Spring5基于注解的开发。
简单来说就是主要利用注解而不是配置文件进行对象创建:
Spring针对bean管理中创建对象提供注解:
(1) @Component 表示一个带注释的类是一个“组件”,成为Spring管理的Bean。当使用基于注解的配置和类路径扫描时,这些类被视为自动检测的候选对象。同时@Component还是一个元注解(注解的注解)。 (2) @Service 组合注解(组合了@Component注解),应用在service层(业务逻辑层) (3) @Controller 组合注解(组合了@Component注解),应用在MVC层(控制层),DispatcherServlet会自动扫描注解了此注解的类,然后将web请求映射到注解了@RequestMapping的方法上。 (4) @Repository 组合注解(组合了@Component注解),应用在dao层(数据访问层)
上面4个注解功能相同,都是创建bean实例。
一、基于注解方式实现属性注入:
步骤:
(1)引入 AOP 依赖 (2)开启组件扫描 (3)创建类,在类上面创建对象注解 (4) ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml"); UserService userService = context.getBean("userService", UserService.class); 获取对象
我们首先要导入aop的包:
接着在配置文件中开启组件扫描:
bean1.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"> <!--开启注解扫描--> <context:component-scan base-package="com.learn"> </context:component-scan> </beans>
注解介绍:
基于注解方式实现属性注入 (1)@AutoWired 表示根据属性类型自动注入 ① 把 service 和 dao对象创建,在 service 和 dao 类 添加创建对象的注解 ② 在 service里面注入 dao对象,在 service 类 添加 dao类型属性,属性上面使用 @AutoWired(不需要添加set方法)
(2)@Qualifier 根据属性名称进行注入 这个注解的使用要和 @AutoWired 在一起使用 @Autowired @Qualifier(value = "userDaoImpl") 根据名称进行注入 (对象所在类的类名 开头第一个字母小写)
(3)@Resource 可以根据类型或名称注入 不推荐用
(4)@Value 注入普通类型属性 @Value(value = "abc") private String name;
创建类,并在类上面添加注解:
Dao:
接口:
public interface UserDao { public void add(); }
接口实现类:
@Repository(value = "userDaoImpl") //Dao注解 value是对象名称 不写的话默认是类名首字母小写 public class UserDaoImpl implements UserDao{ @Override public void add() { System.out.println("Dao add......"); } }
Service:
//注解里面value属性值可以不写,默认是类名称,首字母小写 @Service // 相当于 <bean id = "" class = "" /> id就是这里的value public class UserService { @Value(value = "abc") private String name; //定义dao类型属性 //不需要添加set方法 //添加注入属性注解 @Autowired @Qualifier(value = "userDaoImpl") private UserDao userDao; public void add() { System.out.println("service add......" + name); userDao.add(); } }
java程序:
@Test public void testService() { ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml"); UserService userService = context.getBean("userService", UserService.class); userService.add(); }
输出:
service add......abc
Dao add......
我们可以看到注入到String类型中的值确实是输出来了
而且注入的Dao对象也确实是注入进去了
在注入Dao属性那里我们也可以根据Resource注解注入属性
// //@Resource //根据类型注入 // @Resource(name = "userDaoImpl1") //根据名称注入 // private UserDao userDao;
二、完全注解开发:
完全注解开发,不需要写配置文件,但是需要写配置类:
@Configuration //作为配置类,替代xml配置文件 @ComponentScan(basePackages = {"com.learn"}) public class SpringConfig { }
写过这个类之后就可以实现不用配置文件的注解开发了
java程序:
@Test public void testService2() { ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class); UserService userService = context.getBean("userService", UserService.class); userService.add(); }
注意这里使用
new AnnotationConfigApplicationContext(SpringConfig.class);
这个类的构造器,构造器中元素是配置类的class对象。