applicationContext.xml 开启扫描
<context:component-scan base-package="扫描的包及其子包"/>
bean的创建有关注解
@Component spring容器会实例化当前带有该注解的类,并以指定的名称存放到容器中。 如果没有指定的名称,默认是当前类的首字母小写。
@Controller 表现层 @Service 业务层 @Repository 持久层
bean的存活范围
@Scope: @Scope("prototype")多例 / singleton单例
bean的生命周期
@PostConstruct //创建对象之后执行的初始化方法
@PreDestroy//销毁之前执行的方法
数据注入
@Autowired ==用法一:setter注入== 带有setter或者构造器的方法,加上注解,会有Spring容器调用。 例如: (1) @Repository("aaa") @Scope("singleton") public class AccountDaoImpl implements IAccountDao { public void saveAccount() { System.out.println("accountdao实现类方法"); } } (2) @Service public class AccountServiceImpl implements AccountService { private IAccountDao accountDao; @Autowired public void setAccountDao(@Qualifier("aaa") IAccountDao accountDao) { this.accountDao = accountDao; } 如果方法中有参数,先按照参数的类型去spring容器中找对象,找到传递进来。 =如果在spring容器中有多个匹配的类型,按照参数的名称去找。 =如果有多个类型匹配,并且spring容器中的对象和参数名都不一致,可以使用@Qualifier配合@Autowired来确定具体的制定对象。 ==用法二:构造器注入== 例如: @Service public class AccountServiceImpl implements AccountService { private IAccountDao accountDao; @Autowired public AccountServiceImpl(IAccountDao accountDao) { this.accountDao = accountDao; } 和setter注入的方式一样 ==用法三(重点):私有字段注入== 例如: public class AccountServiceImpl implements AccountService { @Autowired @Qualifier("aaa") private IAccountDao accountDao; spring容器调用,按照类型去spring容器找对象,找到了赋值。 =找到多个相同类型的,按照字段名称去找 =还可以配合@Qualifier制定具体对象
插入
@Resource
功能和@Autowired完全一致,注入对象;
区别:1、
@Resource是JDK中的类,spring对其进行了支持;
@Autowired是spring的类(推荐)
2、
@Resource先按照名称查找;找不到再按照类型查找;@Autowired先按照类型查找;找不到再按照名称查找
扩展 基于类的注解配置
@ComponentScan("com.zzk")----//指定要扫描的包--》<context:component-scan base-package="com.zzk"/>
@Bean //功能和@Autowired类似,被spring容器调用。 //当方法有参数时,按照参数类型注入参数 =如果找到多个参数,按照参数的名称找对象 =方法的返回值,会交给spring容器管理。默认名称为当前方法名 //可以通过@Bean("")来指定存放到spring容器中的名称 例如: @Bean public DataSource createDataSource() { DruidDataSource druidDataSource = new DruidDataSource(); druidDataSource.setDriverClassName("com.mysql.jdbc.Driver"); druidDataSource.setUrl("jdbc:mysql:///class"); druidDataSource.setUsername("root"); druidDataSource.setPassword("root"); return druidDataSource; } 相当于配置文件中的———————— * <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> * <property name="driverClassName" value="com.mysql.jdbc.Driver"/> * <property name="url" value="jdbc:mysql:///class"/> * <property name="username" value="root"/> * <property name="password" value="root"/> * </bean> 测试类的使用时,注意使用纯注解的容器 AnnotationConfigApplicationContext(类.class)
@Import(jdbcConfig.class)
多个配置类 引入其他配置类@Import
导入外部配置文件的注解
1准备外部文件
jdbc.driverClass=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql:///class jdbc.user=root jdbc.password=root
2添加注解 类上
@PropertySource("jdbc.properties") //引入外部配置
3引入key对应的值
@Value("${jdbc.driverClass}") private String driverClass; @Value("${jdbc.url}") private String url; @Value("${jdbc.user}") private String user; @Value("${jdbc.password}") private String password;
spring中集成junit单元测试
1导入依赖要求4.12+
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
2类上加注解
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {SpringConfig.class}/locations = {"classpath*:/*.xml"})----》来标注我们想要导入这个测试类的某些bean
@Autowired
private IAccountService iAccountService;------》容器注入使用IAccountService已经在容器中了