@Configuration
public class StudentConfig {
@Bean
public StudentBean myStudent() {
return new StudentBean();
}
}
想要将对象成功的存储到 Spring 中,我们需要配置⼀下存储对象的扫描包路径,只有被配置的包下的所有类,添加了注解才能被正确的识别并保存到 Spring 中。
在 spring-config.xml 添加如下配置:
<!-- 设置需要存储在Spring中的bean根目录-->
<content:component-scan base-package="com.beans"></content:component-scan>
有两种方式实现注解:
代码示例:
import org.springframework.stereotype.Controller;
@Controller
public class UserController {
public void sayHi(String name) {
System.out.println("Hi," + name);
}
}
注意事项:
①即使在spring配置文件配置了bean的扫描路径,五大类注解也是不能省略的
②即使加了五大类注解,但类没有放在spring配置的Bean路径下,也是不能讲类注解到spring
此时我们先使用之前读取对象的方式来读取上面的UserController 对象,如下代码所示:
public class Application {
public static void main(String[] args) {
// 1.得到 spring 上下⽂
ApplicationContext context =
new ClassPathXmlApplicationContext("spring-config.xml");
// 2.得到 bean
UserController userController = (UserController)
context.getBean("userController");
// 3.调⽤ bean ⽅法
userController.sayHi("Bit");
}
}
代码示例:
import org.springframework.stereotype.Service;
@Service
public class UserService {
public void sayHi(String name) {
System.out.println("Hi," + name);
}
}
代码示例:
@Repository
public class UserRepository {
public void sayHi(String name) {
System.out.println("Hi," + name);
}
}
代码示例:
@Component
public class UserComponent {
public void sayHi(String name) {
System.out.println("Hi," + name);
}
}
代码示例:
@Configuration
public class UserConfiguration {
public void sayHi(String name) {
System.out.println("Hi," + name);
}
}
通过上面示例,我们可以看出,通常我们 bean 使用的都是标准的大驼峰命名,而读取的时候首字母小写就可以获取到 bean 了,如下图所示:
@Component
public class Users {
@Bean
public User user1() {
User user = new User();
user.setId(1);
user.setName("Java");
return user;
}
}
2.重命名 Bean
@Component
public class Users {
@Bean(name = {"u1"})
public User user1() {
User user = new User();
user.setId(1);
user.setName("Java");
return user;
}
}
那么为什么需要怎么多的类注解也是相同的原因,就是让程序员看到类注解之后,就能直接了解当前类的用途,比如:
@Controller:表示的是业务逻辑层
@Servie:服务层
@Repository:持久层
@Configuration:配置层
关系:
- 查看 @Controller / @Service / @Repository / @Configuration 等注解的源码发现Component类是Controller,Repository, Service ,Configuration的父类
区别:
- @Component:这将 java 类标记为 bean。它是任何 Spring 管理组件的通用构造型。spring 的组件扫描机制现在可以将其拾取并将其拉入应用程序环境中
- @Controller:这将一个类标记为 Spring Web MVC 控制器。标有它的 Bean 会自动导入到 IoC 容器中
- @Service:此注解是组件注解的特化。它不会对 @Component 注解提供任何其他行为。您可以在服务层类中使用 @Service 而不是 @Component,因为它以更好的方式指定了意图
- @Repository:这个注解是具有类似用途和功能的 @Component 注解的特化。它为 DAO 提供了额外的好处。它将 DAO 导入 IoC 容器,并使未经检查的异常有资格转换为 Spring DataAccessException
获取 bean 对象也叫做对象装配,是把对象取出来放到某个类中,有时候也叫对象注入
对象装配(对象注⼊)的实现⽅法以下 3 种:
1.属性注入
2.构造方法注入
3.Setter 注入
属性注入是使用 @Autowired 实现的,将 Service 类注入到 Controller 类中
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
@Controller
public class UserController {
// 注⼊⽅法1:属性注⼊
@Autowired
private UserService userService;
public User getUser(Integer id) {
return userService.getUser(id);
}
}
构造方法注入是在类的构造方法中实现注入,如下代码所示:
@Controller
public class UserController2 {
// 注⼊⽅法2:构造⽅法注⼊
private UserService userService;
@Autowired
public UserController2(UserService userService) {
this.userService = userService;
}
public User getUser(Integer id) {
return userService.getUser(id);
}
}
Setter 注入和属性的 Setter 方法实现类似,只不过在设置 set 方法的时候需要加上 @Autowired 注解,如下代码所示:
@Controller
public class UserController3 {
// 注⼊⽅法3:Setter注⼊
private UserService userService;
@Autowired
public void setUserService(UserService userService) {
this.userService = userService;
}
public User getUser(Integer id) {
return userService.getUser(id);
}
}
- 出身不同:@Autowired是Spring的实现,@Resource来自于JDK
- 支持的参数设置不同:@Autowired只支持required参数设置,,而@Resource支持很多参数,比如name,type等
- 支持的注入类型不同:@Autowired可用于:构造函数、成员变量、Setter方法, 而@Resource可用于:成员变量、Setter方法
- 当您创建多个相同类型的 bean 并希望仅使用属性装配其中一个 bean 时,您可以使用@Qualifier 注解和 @Autowired 通过指定应该装配哪个确切的 bean 来消除歧义
- @RequestMapping 注解用于将特定 HTTP 请求方法映射到将处理相应请求的控制器中的特定类/方法。此注释可应用于两个级别:
①类级别:映射请求的 URL
②方法级别:映射 URL 以及 HTTP 请求方法