1、IOC/DI配置管理第三方bean
第三方开发的类配置bean与自主开发的类配置bean有没有区别?
没有,自主开发的类可以控制其中的方法定义,第三方开发的类智能根据已经定义完成的信息进行配置。
第三方开发的类配置bean流程分几步?
1、确认要管理的对象对应的类名
2、确认适用setter注入还是构造器注入,需要查看第三方源代码
3、根据查询结果选择合适的注入方式
2、IOC/DI注解开发
定义Bean对应的注解是**@Component(对应的id名)**
注解如果不起名称,会有一个默认值:当前类名首字母小写
注解不能添加在接口上,因为接口是无法创建对象。
定义Bean的三个衍生注解:
- @Controller:表现层
- @Service:业务层
- @Respository:数据层
3、纯注解开发
定义配置类需要的注解
xml删除,用类(SpringConfig)替换
- @Configuration注解:标识其为一个配置
- @ComponentScan(“…”):包扫描注解,用于加载使用注解格式定义的bean
- @PropertySource(“…”):加载properties配置文件。
读取的properties配置文件有多个,可以使用@PropertySource的属性来指定多个。@PropertySource({“…”,“…”}),注解属性中可以把classpath: 加上 - @Import({xxx.class}):手动引入需要加载的配置类
定义Bean
- @Component
在接口的实现类上方添加注解,对应的接口如果有多个实现类,就需要按名称注入。即在括号内设定id名。
- @Controller:表现层
- @Service:业务层
- @Respository:数据层
当根据类型在容器中找到多个bean,注入参数的属性名又和容器中bean的名称不一致,这时候需要使用@Qualifier来指定注入那个名称的bean对象。
要想将bean对象变成非单例,只需要在其类上添加@scope注解,括号内设置bean的作用范围(singleton单例,prototype非单例)
业务层注解
- 类名前添加指定注解@Service
- 在属性变量上添加@Autowired注解
自动装配,默认按类型装配,
并且不需要提供set方法:自动装配基于反射设计创建对象并暴力反射对应属性为私有属性初始化数据;普通反射只能获取public修饰的内容;暴力反射除了获取public修饰的内容,还可以获取private修改的内容。
数据层注解
- @Repository
- 成员变量上使用@Value,将值写入注解的参数中
注意两者之间的数据类型匹配 - @Value(“${name}”):一把会被用在从properties配置文件中读取内容进行使用
4、注解开发管理第三方bean
对于数据源的bean,新建一个配置类。
配置类注解
@Bean:方法注解,方法定义上方,设置该方法的返回值作为Spring管理的bean
5、Spring整合Mybatis
- 模型类
//实现Serializable接口
@Data//getset等方法
@NoArgsConstructor//空参构造
@AllArgsConstructor//带参构造
public class xxx implements Serializable{
}
- Dao接口
//接口,sql语句
public interface xxxxDao {
}
- Service接口及其实现类
public interface xxxxService{
//接口方法
}
@Service
public class xxxxServiceImpl implements xxxxService {
@Autowired
//Dao对象
//重写方法
}
- Jdbc.properties
Spring的主配置类
- SpringConfig
//配置类注解
@Configuration
//包扫描,主要扫描的是项目中的xxxxServiceImpl类
@ComponentScan("xxxx")
@PropertySource("classpath:jdbc.properties")
@Import(JdbcConfig.class,MybatisConfig.class)
public class SpringConfig {
}
- JdbcConfig
public class JdbcConfig {
@Value("${jdbc.driver}")
private String driver;
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.username}")
private String userName;
@Value("${jdbc.password}")
private String password;
@Bean
public DataSource dataSource(){
DruidDataSource ds = new DruidDataSource();
ds.setDriverClassName(driver);
ds.setUrl(url);
ds.setUsername(userName);
ds.setPassword(password);
return ds;
}
}
- MybatisConfig
public class MybatisConfig {
//定义bean,SqlSessionFactoryBean,用于产生SqlSessionFactory对象
@Bean
public SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource){
SqlSessionFactoryBean ssfb = new SqlSessionFactoryBean();
//设置模型类的别名扫描
ssfb.setTypeAliasesPackage("com.itheima.domain");
//设置数据源
ssfb.setDataSource(dataSource);
return ssfb;
}
//定义bean,返回MapperScannerConfigurer对象
@Bean
public MapperScannerConfigurer mapperScannerConfigurer(){
MapperScannerConfigurer msc = new MapperScannerConfigurer();
msc.setBasePackage("com.itheima.dao");
return msc;
}
}
6、整合Junit
//设置类运行器
@RunWith(SpringJUnit4ClassRunner.class)
//设置Spring环境对应的配置类
@ContextConfiguration(classes = {SpringConfiguration.class}) //加载配置类
//@ContextConfiguration(locations={"classpath:applicationContext.xml"})//加载配置文件