基于注解的SSM开发与springboot自动配置原理

注解总结:

  1. @autowired 与 @resources 区别

    1. 都是依赖注入的注解。

    2. 前者是根据类型去匹配注入到ioc 后者是根据id 的名字去匹配注入到ioc

    3. @autowired 通过类型去匹配有缺点:当一个父类有两个子类时,通过父类向下转型去匹配注入ioc时,会报错,有两个匹配。

    4. @autowired 怎么解决这个问题呢?使用@qualifer("by name")去通过具体的name去注入ioc

    5. @Resource 默认通过by name 去注入ioc

    6. @Resource 想要通过by type 注入ioc则 @Resource(type=LaService.class)

@Configuration 配置类注解

@CompoentScan spring 开启注解扫描

@Import 导入其他配置类

@Bean 将创建的对象放到ioc 容器

@PropertySource 导入外部配置文件

@Value 将简单类型属性注入变量中

@MapperScan 扫描所有Mapper 其实就是将Mapper对象放到ioc 容器

手动整合ssm部分配置(applicationContext.xml)

   <context:component-scan base-package="com.zdq"/>
<!--    开启注解扫描-->
    <context:property-placeholder location="classpath:db.properties"/>
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
    <property name="driverClassName" value="${db.driver}"></property>
    <property name="url" value="${db.url}"></property>
    <property name="username" value="${db.username}"></property>
    <property name="password" value="${db.password}"></property>
</bean>
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
<!--        配置数据源-->
        <property name="configuration">
            <bean class="org.apache.ibatis.session.Configuration">
                <!--日志配置-->
                <property name="logImpl" value="org.apache.ibatis.logging.stdout.StdOutImpl"/>
                <!--开启全局懒加载-->
                <property name="lazyLoadingEnabled" value="true"/>
            </bean>
        </property>
        <property name="typeAliasesPackage" value="com.zdq.bean"/>
<!--        配置缩写-->
        <property name="mapperLocations" value="mapper/*Mapper.xml"></property>
<!--        配置mapper标识-->
        <property name="plugins">
<!--            插件-->
            <bean class="com.github.pagehelper.PageInterceptor"></bean>
        </property>
    </bean>

<!--    自定义将所有的dao  都放到ioc容器里-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.zdq.dao"></property>
    </bean>

我们知道:SpringBoot 无需手动整合,直接引入parent就可以做到大部分配置了。那么SpringBoot是怎么做到的呢?我们来模拟一下:

SpringConfiguration
//spring的注解

@Configuration   //表示当前这个类是一个配置
@ComponentScan("com.qf") //开启Spring注解扫描
@Import(MybatisConfiguration.class) //引入其他的配置类
public class SpringConfiguration {
}
MybatisConfiguration
//配置mybatis的注解:datasource  sqlsessionfactorybean

@Configuration
@PropertySource("classpath:db.properties") //引入外部的配置文件
@MapperScan("com.zdq.mapper") //扫描mapper并放入到SpringIOC中
public class MybatisConfiguration {

    @Value("${jdbc.driverClass}")
    private String driverClassName;
    @Value("${jdbc.url}")
    private String url;
    @Value("${jdbc.username}")
    private String username;
    @Value("${jdbc.password}")
    private String password;

    //配置druid数据源
    @Bean("dataSource")    //将方法的返回值对象添加到SpringIOC容器中,默认的id为方法返回值类型的首字母小写,也可以指定
    public DruidDataSource createDruidDataSource(){
        DruidDataSource druidDataSource = new DruidDataSource();
        druidDataSource.setDriverClassName(driverClassName);
        System.out.println(url);
        druidDataSource.setUrl(url);
        druidDataSource.setUsername(username);
        druidDataSource.setPassword(password);
        return druidDataSource;
    }

    @Bean

    public SqlSessionFactoryBean createSqlSessionFactoryBean
(DruidDataSource dataSource){
        SqlSessionFactoryBean sfb = new SqlSessionFactoryBean();
        //设置数据源
        sfb.setDataSource(dataSource);
        //设置别名
        sfb.setTypeAliasesPackage("com.zdq.pojo");
        //设置mapper映射文件
        //sfb.setMapperLocations(new ClassPathResource("classpath:com/zdq/mapper/*.xml"));

        //settings设置
        org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
        configuration.setLogImpl(StdOutImpl.class);
        sfb.setConfiguration(configuration);
        //plugins设置
        sfb.setPlugins(new PageInterceptor());

        //方式2:直接加载mybatis的核心配置文件
        //sfb.setConfigLocation(new ClassPathResource
("classpath:mybatis-config.xml"));
        return sfb;
    }
MapperScannerConfiguration 
//打开mapper接口的扫描

@Configuration
public class MapperScannerConfiguration {
    @Bean
    public MapperScannerConfigurer createMapperScannerConfigurer(){
        MapperScannerConfigurer msc = new MapperScannerConfigurer();
        msc.setBasePackage("com.zdq.mapper");
        return msc;
    }
}

以上代码基本替代了applicationcontext.xml   的配置。

编写测试类:

ssm手动整合测试:使用spring 的Test方法

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:ApplicationContext.xml")
public class UserDaoTest {
    @Resource
    private UsersServiceImpl usersServiceImpl;
    @Test
    public void selectAll() {
        PageInfo pageInfo = usersServiceImpl.queryAll();
        System.out.println(pageInfo);
    }
}

 通过读取配置类来实现整合:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = SpringConfiguration.class)
public class SpringTest {
    @Test
    public void test01(){
    ApplicationContext ac
    = new AnnotationConfigApplicationContext(SpringConfiguration.class);

        UserService userService = ac.getBean(UserService.class);
        userService.selectAll().forEach(System.out::println);
    }

    @Autowired
    private UserService userService;


    @Test
    public void test02(){
        userService.selectAll().forEach(System.out::println);
    }
}

可以看出有很大的差别。至于SpringBoot具体底层。。待更新

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值