4、Java配置、包扫描

24 阅读2分钟

1.2.2Java配置

像Spring容器注册Bean

这里的@Bean的作用类似于刚才的bean标签,就是像Spring容器中注册一个Bean 默认情况下,beanName就是方法名 @Bean 注解中也有name。表示为这个bean指定名称 也可以为这个bean指定生命周期钩子函数(initmethod,destroymethod)

/**
 * 这个配置类的作用就相当于是applicationcontext.xml 这个配置文件的作用
 */
public class JavaConfig {
    
    @Bean(value = "user2")
    User user(){
        User user = new User();
        user.setId(1);
        user.setName("zhangsan");
        return user;
    }
}

@Configuration注解的作用

/**
 * Configuration 的作用,添加这个注解后,如果调用了一个标记了@Bean的注解方法,那么这个方法不会被立刻调用,而是先去
 * Spring容器中检查这个Bean 是否存在,如果存在,则直接返回,那么目标方法就不会调用了。如果Spring 容器不存在这个Bean方法,
 * 则这个时候会执行目标方法,并且向Spring容器注册这个Bean
 * 实现原理:AOP代理
 */
@Configuration
public class JavaConfig {

    @Bean(value = "user2")
    User user(){
        User user = new User();
        user.setId(1);
        user.setName("zhangsan");
        user.setBook(book());
        return user;
    }

    @Bean
    Book book(){
        Book book = new Book();
        book.setAuthor("luoguanzhong");
        return book;
    }
}
//创建Spring容器
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(JavaConfig.class);

Java代码配置,可以指定Bean的优先级,以及Bean是否可以被其他Bean所依赖

image.png 使用了@Primary 注解,可以用来标记Bean的优先级,如果通过类型来查找的话,那么被标记的Bean会被优先返回

1.2.3包扫描

/**
@Repository 表示把当前类注册到Spring容器中,默认情况下,beanName 就是类名首字母小写 userDao
如果需要,也可以指定beanName
这个注解不是一个,类似的还有3个
@Service: 这个一般加载业务层
@Controller: 这个一般加载表现层(controller层)
@Component:这个加在不明身份的组件上
*/
@Repository
public class UserDao {
   public String sayHello(){
       return "hello";
   }
}
@Service
public class UserService {
    /**
     * @Service就是将UserService注册到Spring 容器中
     * @Autowired 是向 容器要一个 userDao 回来,默认是按照类型去查找
     */
    @Autowired
    UserDao userDao;

    public String sayHello(){
        return userDao.sayHello();
    }
}
@Controller
public class UserController {
    UserService userService;

    /**
     *由于当前类只有这一个构造器,所以Spring容器在获取当前类实例的时候, 只能调用这个构造器
     * 由于这个构造器需要参数,此时就会自动去Spring 容器中找到 UserService 实例
     * @param userService
     * @Autowired 指定使用的构造器
     *
     */
    @Autowired
    public UserController(UserService userService) {
        this.userService = userService;
    }

    public UserController() {
    }

    public String sayHello(){
        return userService.sayHello();
    }
}
@Configuration
//这个就是组件扫描,默认情况,扫描的就是当前配置类所在包下的所有Bean
@ComponentScan
public class JavaConfig {
}