@Service(“accountService”):实现层注解,这时set方法可以不写
@Autowired :自动注入accountDao数据
package cn.kitey.service.impl;
import cn.kitey.dao.AccountDao;
import cn.kitey.dao.impl.AccountDaoImpl;
import cn.kitey.domain.Account;
import cn.kitey.service.AccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* 账户的业务实现层A
*/
@Service("accountService")
public class AccountServiceImpl implements AccountService {
// 当我们使用注解注入的时候set方法不是必要的了
@Autowired //自动注入
private AccountDao accountDao;
public List<Account> findAll() {
return accountDao.findAll();
}
public Account findById(Integer accountId) {
return accountDao.findById(accountId);
}
public void saveAccount(Account account) {
accountDao.saveAccount(account );
}
public void updateAccount(Account account) {
accountDao.updateAccount(account);
}
public void deleteAccount(Integer accountId) {
accountDao.deleteAccount(accountId);
}
}
这个类我们作为主类
Configuration:指定挡前类是一个配置类
ComponentScan:用于通过注解指定spring创建容器要扫面的包
import:用于引用其他配置类
package cn.kitey.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.PropertySource;
/**
* 是一个配置类,作用跟bean.xml相同
*
* spring中新注解:
* Configuration:
* 作用:指定当前类是一个配置类
* 有时可以省略不写
* ComponentScan
* 作用:用于通过注解指定spring创建容器要扫面的包
* 属性
* value:basePackage的作用一样,指定要扫描的包名
* 该注解类似于xml中的:
*
*
* bean:
* 作用:用于把当前对象的返回值存入spring容器中
* 属性:
* name:用于指定bean的id,不写时,为默认值,当前的方法名
* 特点:
* 当使用注解配置方法时,如果方法有参数,spring框架就会去容器查找有没有可用的bean对象
* 查找的方式跟Autowired注解的作用一样的
* import:
* 作用:用于引用其他配置类
* value:用于指定其他配置类的字节码
* 当我梦使用import的注解之后,有import注解的类就为父配置类,导入的为子配置类
*
* PropertySource
* 作用:指定properties文件的位置
* 属性:
* value:指定文件的名称和位置
* 关键字:classpath 表示类路径下
*/
@Import(jdbcConfig.class)
@Configuration
@ComponentScan(value = "cn.kitey")
@PropertySource("classpath:jdbcConfig.properties")
public class SpringConfiguration {
}
bean:用于把当前对象的返回值存入spring容器中
作用:用于把当前对象的返回值存入spring容器中
属性:
name:用于指定bean的id,不写时,为默认值,当前的方法名
特点:
当使用注解配置方法时,如果方法有参数,spring框架就会去容器查找有没有可用的bean对象查找的方式跟Autowired注解的作用一样的
package cn.kitey.config;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.apache.commons.dbutils.QueryRunner;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Scope;
import javax.sql.DataSource;
import java.beans.PropertyVetoException;
public class jdbcConfig {
/**
* 创建QueryRunner对象
* @param dataSource
* @return
*/
@Bean(name = "runner")
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
public QueryRunner createQueryRunner(DataSource dataSource){
return new QueryRunner(dataSource);
}
@Bean(name = "dataSource")
public DataSource createDataSource(){
ComboPooledDataSource ds;
try {
ds = new ComboPooledDataSource();
ds.setDriverClass("com.mysql.jdbc.Driver");
ds.setJdbcUrl("jdbc:mysql://localhost:3306/eesy?serverTimezone=GMT%2B8");
ds.setUser("root");
ds.setPassword("25002500");
} catch (PropertyVetoException e) {
throw new RuntimeException(e);
}
return ds;
}
}
@Before
public void init(){
ApplicationContext xml = new AnnotationConfigApplicationContext(SpringConfiguration.class);
xmlBean = xml.getBean("accountService", AccountServiceImpl.class);
}
这时我们就完成了基于注解的配置
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
@RunWith(SpringJUnit4ClassRunner.class)
public class AccountServiceTest {
}
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = SpringConfiguration.class)
public class AccountServiceTest {
}
//自动注入
@Autowired
private AccountService xmlBean;
这时我们就可以省略代码:
@Before
public void init(){
ApplicationContext xml = new AnnotationConfigApplicationContext(SpringConfiguration.class);
xmlBean = xml.getBean("accountService", AccountServiceImpl.class);
}