Component
如果每次配置组件都需要通过 XML 文件进行配置就会非常的繁琐,也容易出错,所以 spring 有一直可以自动配置组件的方法,即扫描当前包和子包的类, 通过标记 Component 关键字,自动装配组件
新建 Main.java
@Configuration@ComponentScanpublic class Main {public static void main(String[] args) {ApplicationContext applicationContext = new AnnotationConfigApplicationContext(Main.class);UserService userService = applicationContext.getBean(UserService.class);String user = userService.register();System.out.println(user);}}
@Configuration 表示这是一个配置类, 实例化 AnnotationConfigApplicationContext 必须要加上这个注解@ComponentScan 表示这个类会去扫描当前包和子包的所有组件,通过 @AutoWired 进行注入
新建 UserService.java
@Componentpublic class UserService {private EmailService emailService;public UserService(@Autowired EmailService emailService){this.emailService = emailService;}public String register(){this.emailService.sendEmail();return "register successful";}}
新建 EmailService.java
@Componentpublic class EmailService {public void sendEmail(){System.out.println("send email");}}
这样我们就完成了 实例化 -> 注入 两个流程了
Bean
需要注意的一点是,这个只适用于当前包及其子包,如果是不同的包呢? 如何进行实例化和注入?
不同的包,或者第三方的包,我们通过 @Bean 注解来进行注入
新建一个包以及类
注意, 这个类不属于之前的包
import javax.annotation.PostConstruct;import javax.annotation.PreDestroy;public class SecurityService {@PostConstructpublic void init(){System.out.println("init Security checking");}@PreDestroypublic void shutdown(){System.out.println("Security testing done!");}public void doSecurityCheck(){System.out.println("Do Security Checking. ");}}
然后在 UserService 中注入
@Componentpublic class UserService {@Autowiredprivate SecurityService securityService;public User Register(){System.out.println("Register User");System.out.println("register successful");securityService.doSecurityCheck();return new User();}}
最后在 Main 文件里面实例化组件
@ComponentScan@Configurationpublic class Main {@Beanpublic SecurityService createSecurityService(){return new SecurityService();}public static void main(String[] args) {ApplicationContext context = new AnnotationConfigApplicationContext(Main.class);UserService userService = context.getBean(UserService.class);User user = userService.Register();}}
第三方包因为我们无法扫描到,所以通过 @Bean 的方法来进行注入
