使用注解的方式来完成IOC和DI
1、创建配置类
SpringConfig.java
package com.day02Jdbc.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
/**
* @ Author :ShaoWei Sun.
* @ Date :Created in 9:25 2018/11/10
*/
@Configuration//指定该类是一个配置类、等价于一个spring的配置文件
@ComponentScan(basePackages="com.day02Jdbc")//指定扫包范围
@Import(JdbcConfig.class) //引入JdbcConfig.class文件
public class SpringConfig {
}
2、创建jdbc配置类
JdbcConfig.java
public class JdbcConfig {
/**
* Bean注解:该注解只能写在方法上,表明使用此方法创建一个对象,并且放入spring容器。
* name属性:给当前@Bean注解方法创建的对象指定一个名称(即bean的id)。
* @return
*/
@Bean(name="dataSource")
public DataSource createDataSource(){
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/mybatis");
dataSource.setUsername("root");
dataSource.setPassword("123456");
return dataSource;
}
@Bean(name="jdbcTemplate")
public JdbcTemplate createJdbcTemplate(DataSource dataSource){
return new JdbcTemplate(dataSource);
}
}
3、引入jdbc属性文件
创建Jdbc属性文件 resources/jdbc.properties
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root
jdbc.password=sswqzx
在jdbcConfig中引入jdbc属性资源文件
-
package com.day02Jdbc.config; import com.alibaba.druid.pool.DruidDataSource; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.PropertySource; import org.springframework.jdbc.core.JdbcTemplate; import javax.sql.DataSource; //import javax.sql.DataSource; /** * @ Author :ShaoWei Sun. * @ Date :Created in 9:28 2018/11/10 */ @PropertySource("classpath:jdbc.properties") public class JdbcConfig { @Value("${jdbc.driverClass}") private String driver; @Value("${jdbc.url}") private String url; @Value("${jdbc.username}") private String user; @Value("${jdbc.password}") private String password; /** * Bean注解:该注解只能写在方法上,表明使用此方法创建一个对象,并且放入spring容器。 * name属性:给当前@Bean注解方法创建的对象指定一个名称(即bean的id)。 * @return */ @Bean(name="dataSource") public DataSource createDataSource(){ DruidDataSource dataSource = new DruidDataSource(); dataSource.setDriverClassName(driver); dataSource.setUrl(url); dataSource.setUsername(user); dataSource.setPassword(password); return dataSource; } @Bean(name="jdbcTemplate") public JdbcTemplate createJdbcTemplate(DataSource dataSource){ return new JdbcTemplate(dataSource); } }
注意:
@Bean注解也可以不用指定name,因为基本上都是按照类型注入;如果不指定name,默认是@Bean注解所在的方法的名字。
在SpringConfig中引入JdbcConfig
package com.day02Jdbc.config; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; /** * @ Author :ShaoWei Sun. * @ Date :Created in 9:25 2018/11/10 */ @Configuration//指定该类是一个配置类、等价于一个spring的配置文件 @ComponentScan(basePackages="com.day02Jdbc")//指定扫包范围 @Import(JdbcConfig.class) //引入JdbcConfig.class文件 public class SpringConfig { }
4、在实现类上加上对应的注解
注意:在使用@Component、@Service、@Repository注解时,可以不指定bean的id,因为基本上都是按照类型注入;如果不指定id,默认是类名首字母小写。
CustomerServiceImpl.java
package com.day02Jdbc.service.Impl; import com.day02Jdbc.dao.CustomerDao; import com.day02Jdbc.domain.Customer; import com.day02Jdbc.service.CustomerService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; import java.util.List; /** * @ Author :ShaoWei Sun. * @ Date :Created in 17:06 2018/11/8 */ @Service("customerService") public class CustomerServiceImpl implements CustomerService { @Autowired private CustomerDao customerDao ; // public void setCustomerDao(CustomerDao customerDao){ // this.customerDao = customerDao; // } @Override public List<Customer> findAllCustomer() { List<Customer> list = customerDao.findAll(); return list; } } //CustomerDaoImpl.java package com.day02Jdbc.dao.Impl; import com.day02Jdbc.dao.CustomerDao; import com.day02Jdbc.domain.Customer; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.jdbc.core.BeanPropertyRowMapper; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Repository; import java.util.List; /** * @ Author :ShaoWei Sun. * @ Date :Created in 17:09 2018/11/8 */ @Repository("customerDao") public class CustomerDaoImpl implements CustomerDao { @Autowired private JdbcTemplate jdbcTemplate;//不需要实例化,通过spring依赖注入进来,采用xml配置,需要提供set方法 // public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { // this.jdbcTemplate = jdbcTemplate; // } @Override public List<Customer> findAll() { List<Customer> list = jdbcTemplate.query("select * from cst_customer",new BeanPropertyRowMapper<Customer>(Customer.class)); return list; } }
5、测试
package com.day02Jdbc.test; import com.day02Jdbc.config.SpringConfig; import com.day02Jdbc.domain.Customer; import com.day02Jdbc.service.CustomerService; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import java.util.List; /** * @ Author :ShaoWei Sun. * @ Date :Created in 9:44 2018/11/10 */ //@RunWith(SpringJUnit4ClassRunner.class)//指定采用spring的运行器来执行单元测试方法 //@ContextConfiguration("classpath:applicationContext.xml")//指定spring配置文件的路径 public class TestFindAnno { @Test public void test1(){ ApplicationContext ac = new AnnotationConfigApplicationContext(SpringConfig.class); CustomerService customerService = (CustomerService) ac.getBean("customerService"); List<Customer> list = customerService.findAllCustomer(); for (Customer customer : list) { System.out.println("customer = " + customer); } } }