1、基于注解方式实现bean管理
Spring针对Bean管理中创建对象提供注解
(1)@Component 注入一般的bean
(2)@Service 注入业务层
(3)@Controller 注入控制层
(4)@Repository 注入持久层
上面四个注解功能是一样的,都可以用来创建bean实例,只是为了方便区分不同的层次,实际上可以混用。
1、环境搭建
1、引入依赖
将demo2复制过来,删除不必要的文件,需要引入aop的包
2、在配置文件中开启组件扫描
3、创建类,并使用注解
package com.francis.spring5.service;
import org.springframework.stereotype.Component;
/**
* @author Francis
* @create 2021-06-07-19:17
*/
@Component(value = "userService")
/**等价与<bean id="userService"
* class="com.francis.spring5.service.UserService"></bean>
* value的值可以省略,默认为类名的首字母小写
*/
public class UserService {
public void add(){
System.out.println("service addMethod");
}
}
package com.francis.spring5.test;
import com.francis.spring5.service.UserService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* @author Francis
* @create 2021-06-07-19:22
*/
public class AnnotationTest {
@Test
public void componentTest(){
ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
UserService userService = context.getBean("userService", UserService.class);
System.out.println(userService);
userService.add();
}
}
<?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.francis.spring5"/>
<!--===============================================================================-->
<!--示例1:
use-default-filters="false" 表示现在不使用默认filter,
自己配置filtercontext:include-filter ,设置只扫描com.francis.spring5包下带@Controller的类-->
<!-- <context:component-scan base-package="com.francis.spring5" use-default-filters="false">-->
<!-- <context:include-filter type="annotation"-->
<!-- expression="org.springframework.stereotype.Controller"/>-->
<!-- </context:component-scan>-->
<!--===============================================================================-->
<!--示例2:
下面配置扫描包所有内容context:exclude-filter:设置不扫描com.francis.spring5包下带@Controller的类-->
<!-- <context:component-scan base-package="com.francis.spring5">-->
<!-- <context:exclude-filter type="annotation"-->
<!-- expression="org.springframework.stereotype.Controller"/>-->
<!-- </context:component-scan>-->
</beans>
2、基于注解方式实现属性注入
1、@Autowired
根据类型自动注入
2、@Qualifier
根据属性的名称注入,需要配合@Autowired才能进行使用,多在一个类有多个实现类,无法通过类型自动注入的场合使用
3、@Resource
既可以根据属性类型注入,也可以根据属性名称注入,由JDK提供,但spring官方不推荐使用。
根据类型进行注入
根据名称进行注入
上面三个注解都是对对象属性进行注入,要实现对普通类型属性进行注入,使用注解**@Value**
4、@Value
3、完全注解开发
在使用注解开发时,我们在配置文件中配置了开启组件扫描,虽然已经比较方便了,但我们还可以完全脱离配置文件,使用纯注解开发,将原来配置文件里的开组件扫描在配置类中实现。
环境,将demo3复制更名为demo4,删除原来的bean1.xml,新增一个配置类,其他不变,如图:
package com.francis.spring5.common.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
/**
* @author Francis
* @create 2021-06-07-20:16
*/
@Configuration
@ComponentScan(basePackages =
{"com.francis.spring5"})
public class SpringConfig {
}
@Test
public void annotationTest() {
ApplicationContext context =
new AnnotationConfigApplicationContext(SpringConfig.class);
UserController userController = context.getBean("userController", UserController.class);
System.out.println(userController);
userController.test();
}