1.基于注解格式正确定义bean
(1)注解加配置方式
(1)使用@Component定义bean
@Component("bookDao")
public class BookDaoImpl implements BookDao {}
@Component("bookService")
public class BookServiceImpl implements BookService {}
(2)核心配置文件中通过组件扫描加载bean
<context:component-scan base-package="com.spring"/>
注:
Spring提供@Component注解的三个衍生注解,作用完全一致
@Controller:用于表现层bean定义
@Service:用于业务层bean定义
@Repository:用于数据层bean定义
(2)纯注解方式
(1)定义一个配置类,写上注解
@Configuration
@ComponentScan("com.spring")
public class SpringConfig {}
(2)读取Spring核心配置文件初始化容器对象切换为读取Java配置类初始化容器对象
//加载配置文件初始化容器
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
//加载配置类初始化容器
ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
2.能够基于注解格式正确定义管理第三方bean
使用独立的配置类管理第三方的bean
(1)独立的配置类,以jdbc为例
public class JdbcConfig {
@Bean //返回的DataSource作为一个bean被接收
public DataSource dataSource(){
DruidDataSource ds = new DruidDataSource();
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql://localhost:3306/spring_db");
ds.setUsername("root");
ds.setPassword("root");
return ds;
}
}
(2)将独立的配置类导入核心配置类
@Configuration
@Import(jdbcConfig.class) //若有多个独立配置类则需要@Import({jdbcConfig.class,xxx.class})用数组的格式
public class SpringConfig {}
3.能够基于注解格式为第三方bean注入资源/属性
(1)简单类型依赖注入,直接抽取出来作为变量,上面注解Value填写值
public class JdbcConfig {
@Value("com.mysql.jdbc.Driver")
private String driver;
@Value("jdbc:mysql://localhost:3306/spring_db")
private String url;
@Value("root")
private String userName;
@Value("root")
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;
}
}
(2)引用类型依赖注入
在核心配置类中使用@ComponentScan注解扫描配置类所在的包,加载对应的配置类信息
@Bean //只需要加一个形参,spring会按照类型查找对应的bean,若有则直接注入
public DataSource dataSource(BookService bookService){
System.out.println(bookService); //打印可看到已经注入成功
DruidDataSource ds = new DruidDataSource();
//属性设置
return ds;
}
4.能够基于注解格式实现Spring整合MyBatis
(1)导入依赖
<dependency>//spring操作jdbc的依赖
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
<dependency>//spring整合mybatis的依赖
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency>
(2)在config包下创建三个类,分别为独立配置类,spring核心配置类,spring整合mybatis的类
独立配置类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;
}
}
spring核心配置类SpringConfig
@Configuration //@Configuration:表示该类为spring核心配置类
@ComponentScan("com.itheima") //@ComponentScan:扫描对应包下的bean
@PropertySource("classpath:jdbc.properties") //@PropertySource:加载类路径jdbc.properties文件
@Import({JdbcConfig.class,MybatisConfig.class}) //@Import:导入其他独立配置类
public class SpringConfig {
}
spring整合mybatis的类MybatisConfig
public class MybatisConfig {
//定义bean,SqlSessionFactoryBean,用于产生SqlSessionFactory对象
@Bean
public SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource){
SqlSessionFactoryBean ssfb = new SqlSessionFactoryBean();
ssfb.setTypeAliasesPackage("com.itheima.domain"); //真正需要修改的地方,原配置文件中为<typeAliases> <package name="com.itheima.domain"/> </typeAliases>初始化类型别名
ssfb.setDataSource(dataSource);
return ssfb;
}
//定义bean,返回MapperScannerConfigurer对象
@Bean
public MapperScannerConfigurer mapperScannerConfigurer(){
MapperScannerConfigurer msc = new MapperScannerConfigurer();
msc.setBasePackage("com.itheima.dao");//真正需要修改的地方,mybatis需要映射的mapper对象的位置
return msc;
}
}
(3)编写测试类
public class App {
public static void main(String[] args) {
ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
AccountService accountService = ctx.getBean(AccountService.class);
Account ac = accountService.findById(1);
System.out.println(ac);
}
}