注解总结:
-
@autowired 与 @resources 区别
-
都是依赖注入的注解。
-
前者是根据类型去匹配注入到ioc 后者是根据id 的名字去匹配注入到ioc
-
@autowired 通过类型去匹配有缺点:当一个父类有两个子类时,通过父类向下转型去匹配注入ioc时,会报错,有两个匹配。
-
@autowired 怎么解决这个问题呢?使用@qualifer("by name")去通过具体的name去注入ioc
-
@Resource 默认通过by name 去注入ioc
-
@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具体底层。。待更新