Spring指的是Spring Framework,通常我们称之为Spring框架。Spring框架是一个分层的面向切面的Java应用程序的一站式解决框架,它是Spring技术栈的核心和基础,是为了解决企业级引用开发的复杂性而创建的。
<dependencies>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-contextartifactId>
<version>5.3.24version>
dependency>
dependencies>
<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/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<context:component-scan base-package="com.text.spring">context:component-scan>
beans>
Spring提供了以下多个注解,这些注解可以直接标注在java类上,将它们定义成Spring Bean。
注解 | 说明 |
---|---|
@Component | 该注解用于描述Spring中的Bean,它是一个泛化的概念,仅仅标识容器中的一个组件(Bean),并且可以作用在任何层次,例如Service层、Dao层等,使用时只需将该注解标注在相应的类上即可。 |
@Respository | 注解用于数据访问层(Dao层)的类标识为Spring中的Bean,功能与@Component相同。 |
@Service | 该注解通常作用在业务层(Service层),用于将业务层的类标识为Spring中的Bean,其功能与@Component相同。 |
@Controller | 该注解通常作用在控制层(如SpringMVC的Controller),用于将控制层的类标识为Spring中的Bean,其功能与@Component相同。 |
// value可以不写,默认为类名首字母小写
//@Component(value = "user") //
//@Repository
//@Service
@Controller
public class User {
}
public class TestUser {
@Test
public void testUser(){
ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
User user = context.getBean("user", User.class);
System.out.println("user = " + user);
}
}
public class UserController {
private UserService userService;
public void addController(){
System.out.println("controller is running...");
userService.addService();
}
}
public interface UserService {
public void addService();
}
public class UserServiceImpl implements UserService {
@Override
public void addService() {
System.out.println("service is running...");
}
}
@Controller
public class UserController {
// 注入service
// 第一种方式:属性注入
@Autowired // 根据类型找到对象,完成注入
private UserService userService;
}
public class TestUserController {
@Test
public void testUserController(){
ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
UserController controller = context.getBean(UserController.class);
controller.addController();
}
}
// 第三种方式:构造方法注入
private UserService userService;
@Autowired
public UserController(UserService userService) {
this.userService = userService;
}
// 第四种方式:形参注入
private UserService userService;
public UserController(@Autowired UserService userService) {
this.userService = userService;
}
// 第五种方式:只有一个有参数构造函数,无注解
private UserService userService;
public UserController(UserService userService) {
this.userService = userService;
}
@Service
public class UserServiceImpl2 implements UserService{
@Override
public void addService() {
System.out.println("service2 is running...");
}
}
测试发现报错
因为UserService有两个实现类,而@Autowired注解根据byType定位,所以找到了两个实现类
解决:修改UserController (使用两个注解)
// 1.第六种方式:根据类型和名称一起注入
@Autowired
@Qualifier(value = "userServiceImpl2") // 类名首字母小写
private UserService userService;
// 2.将构造函数注释
@Resource注解也可以完成属性注入。它和@Autowired注解的区别如下
@Controller("myUserController")
public class UserController {
// 根据名称进行注入
@Resource(name="myUserService")
private UserService userService;
public void add(){
System.out.println("controller...");
userService.add();
}
}
@Service("myUserService")
public class UserServiceImpl implements UserService {
全注解开发就是不再使用spring配置文件了,写一个配置类来代替配置文件。
// 配置类
@Configuration
// 开启组件扫描
@ComponentScan("cn.tedu.spring")
public class SpringConfig {
}
public class TestUserControllerAnno {
public static void main(String[] args) {
// 加载配置类
ApplicationContext context =
new AnnotationConfigApplicationContext(SpringConfig.class);
UserController controller = context.getBean(UserController.class);
controller.add();
}
}