在Spring中,想要将一个Bean注册到容器中,我们可以有三种方式。
- Xml文件注入,最基本的方式
- 自动化扫描,需要配合注解
- Java配置,在SpringBoot中使用广泛
Java配置
在Java配置中,我们只需要定义一个类来代替之前的application.xml文件。
@Configuration
public class SpringConfig {
@Bean
User user() {
return new User();
}
}
- @Configuration -> 相当于application.xml,表示这是一个配置类
- @Bean -> 相当于
<bean class="com.bug.User" id="user"/>
标签 - 方法名相当于bean的id
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
User user = (User) ctx.getBean("user");
System.out.println(user);
}
自动化扫描
在SSM开发中,我们使用大量的自动化配置,自动化配置可以通过Java配置来实现,也可以通过xml配置来实现。
如果有一个类,我们希望在自动化扫描时将这个类注入到Spring容器中,那么可以给他添加一个@Component注解,作用相当于bean标签,不过需要被扫描到才能生效。
基于@Component注解,还有其他三个:
- @Controller
- @Service
- @Repository
这几个功能都是一致的,主要是为了区别不同的业务层时使用 - 在Controller层,添加注解时,使用@Controller
- 在Service层,添加注解时,使用@Servcie
- 在Dao层时,添加注解时,使用@Dao
- 在其他组件上,使用@Component
@Service
public class UserService {
public void print() {
System.out.println("调用了print...");
}
}
接下来需要进行自动化扫描,自动化扫描有两种方法,一种时Java配置实现,一种是xml配置实现。如下Java配置:
Java配置扫描
@Configuration
@ComponentScan(basePackages = "com.bug.service")
public class SpringConfig {
}
当这个配置类加载时,会去扫描com.bug.service的注解,将相关类加入Spring容器中。
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
UserService userService = (UserService) ctx.getBean("userService");
userService.print();
}
注意通过@Service注解的类,bean的名字默认是类名首字母小写,如UserService,bean的名字为userService,当然也可以在Service注解里面自定义名字。
xml配置扫描
<context:component-scan base-package="com.bug.service"/>
public static void main(String[] args) {
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("application.xml");
UserService userService = (UserService) ctx.getBean("userService");
userService.print();
}
会发现,同样可以扫描到。
对象注入
自动扫描时对象注入主要有两种:
- Autowired
- Resources
@Repository
public class UserDao {
public void print() {
System.out.println("userDao...");
}
}
在Service中注入
@Service
public class UserService {
@Autowired
private UserDao userDao;
public void print() {
System.out.println("调用了print...");
}
public void pDao() {
userDao.print();
}
}
配置自动化扫描
<context:component-scan base-package="com.bug.service"/>
<context:component-scan base-package="com.bug.dao"/>
结果测试
public static void main(String[] args) {
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("application.xml");
UserService userService = (UserService) ctx.getBean("userService");
userService.pDao();
}
打印出结果,说明ok。
注解异同
- @Autowired是根据类型去查找,这个对象只能有一个,否则报错。
- @Resource是根据名称去查找,默认名称是变量名,也可以手动自定义名称,可以有多个对象实例。