1.存储对象
通过注解来替代配置,依然需要配置扫描包的类对象
1.配置扫描路径
<?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:content="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
https://www.springframework.org/schema/context/spring-context.xsd">
<content:component-scan base-package="com.bean">
</content:component-scan>
<!-- <bean id="user" class="com.bit.beans.User"></bean>-->
</beans>
注册扫描的包
<content:component-scan base-package="com.bean">
</content:component-scan>
2.添加注解存储Bean对象
有两种注解类型可以实现:
- 类注解:@Controller、@Service、@Repository、@Component、@Configuration。
- ⽅法注解:@Bean。
package com.bean;
import org.springframework.stereotype.Controller;
/**
* Created by 伦敦看日出
* Description:通过@Controller注解将对象存储到Spring中
* User: yyt
* Date: 2023-04-22
* Time: 15:22
*/
@Controller
public class User {
public String sayHi(String name) {
return name + ": spring-bean";
}
}
启动类App
import com.bean.User;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;
public class App {
public static void main(String[] args) {
// 1.获取Spring上下文对象,指定Spring的配置文件
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
// 2.加载某个bean
User user = (User) context.getBean("user");
// 3.调用相应的方法
System.out.println(user.sayHi("Java"));
}
}
3.为什么要这么多注解
让程序员看到类注解可以直接了解当前类的用途
⽐如:
- @Controller:表示的是业务逻辑层;
- @Servie:服务层;
- @Repository:持久层;
- @Configuration:配置层。
@Controller / @Service / @Repository / @Configuration 等注解是 @Component 的“⼦类”
4.注意Bean的命名
bean一般都是使用大驼峰命名,读取的时候首字母小写,但是遇到前两个字母都大写的时候就不能将首字母小写,而是要将两字母都大写。
5.方法注解
@Bean方法注解是添加到方法上,需要搭配类注解一起使用
A. 创建User对象
package com.bean;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Controller;
public class User {
private int id;
private String name;
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
B. 添加注解
package com.bean;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Controller;
@Controller
public class Users {
@Bean
public User user1() {
User user = new User();
user.setId(1);
user.setName("Bean");
return user;
}
}
C. 获取bean对象中的user1
import com.bean.User;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;
public class App {
public static void main(String[] args) {
// 1.获取Spring上下文对象,指定Spring的配置文件
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
// 2.加载某个bean
User user = (User) context.getBean("user1");
// 3.调用相应的方法
System.out.println(user.toString());
}
}
6.重命名Bean
@Bean(name = {"u1","u2"})
@Bean({"u1","u2"}) // name= 可以省略
2.获取Bean对象(对象装配)
对象装配(对象注⼊)的实现⽅法以下 3 种
- 属性注⼊
- 构造⽅法注⼊
- Setter 注⼊
1.属性注⼊
属性注⼊是使⽤ @Autowired 实现的,将 Service 类注⼊到 Controller 类中。
Service 类代码:
package com.bean.service;
import com.bean.User;
import org.springframework.stereotype.Service;
import javax.xml.ws.ServiceMode;
@Service
public class UserService {
public User getUser(int id) {
User user = new User();
user.setId(1);
user.setName("spring");
return user;
}
}
Controller 类代码:
package com.bean.Controller;
import com.bean.User;
import com.bean.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
@Controller
public class UserController {
// 注入方法1:属性注入
@Autowired
private UserService service;
public User getUser(int id) {
return service.getUser(id);
}
}
获取 Controller中的getUser方法:
package com.bean;
import com.bean.Controller.UserController;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class ControllerTest {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
UserController userController = context.getBean(UserController.class);
System.out.println(userController.getUser(1).toString());
}
}
输出:
User{id=1, name=‘Bean’}
2.构造方法注入(推荐)
@Controller
public class UserController2 {
private UserService userService;
@Autowired
public UserController2(UserService userService) {
this.userService = userService;
}
public User getUser(int id) {
return userService.getUser(id);
}
}
3.Setter注入
@Controller
public class UserController3 {
private UserService userService;
@Autowired
public void setUserService(UserService userService) {
this.userService = userService;
}
public User getUser(int id) {
return userService.getUser(id);
}
}
4.@Autowired 和 @Resource 的区别
- 出身不同:@Autowired 来⾃于 Spring,⽽ @Resource 来⾃于 JDK 的注解;
- 使⽤时设置的参数不同:相⽐于 @Autowired 来说,@Resource ⽀持更多的参数设置,例如 name 设置,根据名称获取 Bean。
- 修饰对象不同,@Autowired用于属性注入
5.同一类型多个@Bean报错
解决同⼀个类型,多个 bean 的解决⽅案有以下两个:
- 使⽤ @Resource(name=“user1”) 定义。
- 使⽤ @Qualifier 注解定义名称。
@Autowired 和 @Resource 的区别
- 出身不同:@Autowired 来⾃于 Spring,⽽ @Resource 来⾃于 JDK 的注解;
- 使⽤时设置的参数不同:相⽐于 @Autowired 来说,@Resource ⽀持更多的参数设置,例如 name 设置,根据名称获取 Bean。
- 修饰对象不同,@Autowired用于属性注入
5.同一类型多个@Bean报错
解决同⼀个类型,多个 bean 的解决⽅案有以下两个:
- 使⽤ @Resource(name=“user1”) 定义。
- 使⽤ @Qualifier 注解定义名称。