关于SpringBoot的配置 (IOC)

1、@Configuration

从Spring3.0,@Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。

注意:@Configuration注解的配置类有如下要求:

@Configuration不可以是final类型;
@Configuration不可以是匿名类;
嵌套的configuration必须是静态类。
一、用@Configuration加载spring
1.1、@Configuration配置spring并启动spring容器
1.2、@Configuration启动容器+@Bean注册Bean
1.3、@Configuration启动容器+@Component注册Bean
1.4、使用 AnnotationConfigApplicationContext 注册 AppContext 类的两种方法
1.5、配置Web应用程序(web.xml中配置AnnotationConfigApplicationContext)
 

@Configuation加载Spring方法

@Configuration配置spring并启动spring容器

@Configuration标注在类上,相当于把该类作为spring的xml配置文件中的<beans>,作用为:配置spring容器(应用上下文)

@Configuation总结

 @Configuation等价于<Beans></Beans>

 @Bean等价于<Bean></Bean>

 @ComponentScan等价于<context:component-scan base-package=”com.dxz.demo”/>
 

2、@Service @Controller @Repository @Component 

@Service用于标注业务层组件

@Controller用于标注控制层组件(如struts中的action)

@Repository用于标注数据访问组件,即DAO组件

@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。

 

3、@Mapper和@Repository的区别

  • @Mapper 是 Mybatis 的注解,和 Spring 没有关系,@Repository 是 Spring 的注解,用于声明一个 Bean。

在 Spring 程序中,Mybatis 需要找到对应的 mapper,在编译的时候动态生成代理类,实现数据库查询功能,所以我们需要在接口上添加 @Mapper 注解。

@Mapper
public interface UserDao {
    ...
}

但是,仅仅使用@Mapper注解,我们会发现,在其他变量中依赖注入,IDEA 会提示错误,但是不影响运行。因为我们没有显式标注这是一个 Bean,IDEA 认为运行的时候会找不到实例注入,所以提示我们错误。如下图,会有红色波浪线。

在这里插入图片描述

尽管这个错误提示并不影响运行,但是看起来很不舒服,所以我们可以在对应的接口上添加 bean 的声明,如下:

@Repository  // 也可以使用@Component,效果都是一样的,只是为了声明为bean
@Mapper
public interface UserDao {
    
    @Insert("insert into user(account, password, user_name) " +
            "values(#{user.account}, #{user.password}, #{user.name})")
    int insertUser(@Param("user") User user) throws RuntimeException;
}

  • 正如上面说的,@Repository 用于声明 dao 层的 bean,如果我们要真正地使用 @Repository 来进行开发,那是基于代码的开发,简单来说就是手写 JDBC。

@Repository
public class UserDaoImpl implements UserDao{
    
    @Override
    public int insertUser(){
        JdbcTemplate template = new JdbcTemplate();
        ...
    }
}

4、其他扫描手段

基于注解的开发也有其他手段帮助 Mybatis 找到 mapper,那就是 @MapperScan 注解(可以代替@Mapper),可以在启动类上添加该注解,自动扫描包路径下的所有接口。使用这种方法,接口上不用添加任何注解。

@SpringBootApplication
@MapperScan("com.scut.thunderlearn.dao")
public class UserEurekaClientApplication {

    public static void main(String[] args) {
        SpringApplication.run(UserEurekaClientApplication.class, args);
    }
}

5、@ComponentScan

如果你理解了ComponentScan,你就理解了Spring

Spring是一个依赖注入(dependency injection)框架。所有的内容都是关于bean的定义及其依赖关系

定义Spring Beans的第一步是使用正确的注解@Component或@Service或@Repository

但是,Spring不知道你定义了某个bean除非它知道从哪里可以找到这个bean

ComponentScan做的事情就是告诉Spring从哪里找到bean

由你来定义哪些包需要被扫描。一旦你指定了,Spring将会将在被指定的包及其下级包(sub packages)中寻找bean

 

Spring Boot项目

总结:

如果你的其他包都在使用了@SpringBootApplication注解的main
    app所在的包及其下级包,则你什么都不用做,SpringBoot会自动帮你把其他包都扫描了(默认只扫描和主类处于同包下的Class)
   
    如果你有一些bean所在的包,不在main
    app的包及其下级包,那么你需要手动加上@ComponentScan注解并指定那个bean所在的包

 

6. @PostContruct

@PostContruct是spring框架的注解,在方法上加该注解会在项目启动的时候执行该方法,也可以理解为在spring容器初始化的时候执行该方法。

 

Spring IOC容器初始化创建之后,Bean初始化之前和销毁之前,执行@PostConstruct注解的方法。一般用于一些项目初始化的设定。比如Spring IOC Container 初始化之后,用@PostConstruct注解Quartz的 CronTrigger 用于初始化定时器(向定时器中添加定时启动的JOB)。那么项目运行时就能自动的运行CronTrigger 中的job了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值