1、准备工作
在自动化扫描时,能让类自动注册到Spring容器中去,那么可以给该类添加一个@Service,作为一个标记,和@Service注解功能类似的一共有四个:
@service: 在Service层上添加注解
@Repository:在Dao层添加注解
@Controller:在Controller层添加注解
@Component:在其他组件上添加注解
package prg.javaboy.ioc.service;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
@Service
public class UserService {
public List<String> getAllUser(){
List<String> users = new ArrayList<>();
for (int i = 0; i < 10; i++) {
users.add("javaboy:" + i);
}
return users;
}
}
2、Java代码配置自动扫描
@Configuration
@ComponentScan(basePackages = "org.javaboy.ioc.service")
public class JavaConfig {
}
然后,在项目启动中加载配置类,在配置类中,通过@CompontScan注解指定要扫描的包(如未指定。默认情况下扫描的是配置类所在的包下载的Bean以及配置类所在的包下的子包下的类),然后就可以获取UserService的实例了:
public class main {
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(JavaConfig.class);
UserService userService = ctx.getBean(UserService.class);
System.out.println("userService.getAllUser() = " + userService.getAllUser());
}
}
ps.注意问题:
1、Bean的名字叫什么?
默认情况下,Bean的名字是类名首字母小写。例如上面的UserService,他的实例名,默认就是userService。如果开发者想要自定义名字,就直接在@Service注解中添加即可。
2、有几种扫描方式?
上面的配置,我们是按照包的位置来扫描的。也就是说,Bean必须放在指定的扫描位置,否则,即使你有@Service注解,也扫描不到。
除了按照包的位置来扫描,还有另一种方式,就是根据注解来扫描。例如如下配置:
@Configuration
@ComponentScan(basePackages = "org.javaboy.ioc.service",useDefaultFilters = true,
excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION,classes = Controller.class)})
public class JavaConfig {
}
这个配置表示扫描org.javaboy.javaconfig下所有Bean,但是除了Controller。
3、XML配置自动化扫描
这行配置表示扫描org.javaboy.ioc.javaconfig下所有的Bean当然也可以按照类来扫描
<context:component-scan base-package="org.javaboy.ioc.javaconfig"/>
XML配置完,在java加载XML配置:
public class XMLYest {
public static void main(String[] args) {
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("ApplicationContext.xml");
UserService userService = ctx.getBean(UserService.class);
List<String> list = userService.getAllUser();
System.out.println("list = " + list);
}
}
也可以在XML配置中按照注解的类型进行扫描:
<context:component-scan base-package="org.javaboy.ioc.javaconfig" use-default-filters="true">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>