前15个实验请见文章
Spring学习——IOC(3)
Spring学习——IOC(2)
实验16
实验:使用@Autowired
注解实现根据类型实现自动装配★
@Autowired
-
Spring会自动的为这个属性赋值(通过在容器中找到这个属性对应的组件)
-
原理:以BookService 的自动装配为例
@Autowired
private BookService bookService;
先按照类型在容器中找到对应的组件;bookService = ioc.getBean(BookService .getClass)
- 找到一个——赋值
- 没找到——抛异常
- 找到多个——按照变量名作为id继续匹配;若匹配上,则装配;否则报错,匹配失败;
@Qualifier
注解使用指定一个新的字符串作为id@Qualifier("bookService")
,再找不到则报错@Autowired(required=false)
注解允许找不到对应组件的话就装配null
@Scope(value="prototype")
@Repository("bookDao01")
public class BookDao {
@Autowired
private DataSource dataSource;
public void saveBook() throws SQLException{
Connection connection = dataSource.getConnection();
System.out.println("获取数据库连接:"+connection);
System.out.println("图书已经保存");
}
}
@Service
public class BookService {
@Autowired
private BookDao bookDao;
public void save() throws SQLException{
System.err.println("BookService正在调用BookDao...保存图书");
bookDao.saveBook();
}
}
//属性的自动注入
@Controller
public class BookServlet {
//自动的为这个属性赋值
@Qualifier("bookService")
@Autowired
private BookService bookService;
public void deGet() throws SQLException{
bookService.save();
}
}
@Test
public void test05() throws SQLException{
BookServlet bookServlet = (BookServlet) ioc02.getBean(BookServlet.class);
bookServlet.deGet();
}
输出:
BookService正在调用BookDao...保存图书
获取数据库连接:com.mchange.v2.c3p0.impl.NewProxyConnection@5ffead27
图书已经保存
实验17
在方法的形参位置使用@Qualifier注解:
- 这个方法会在bean创建的时候自动运行
- 在方法上使用@Autowired,则这个方法的每一个参数都会注入值
@Autowired
public void test(@Qualifier("bookDao")BookDao bookDao){
System.out.println("Spring运行了这个方法"+bookDao);
}
@Autowired、@Resourse都是自动装配的注解
- @Autowired:是Spring内定义的注解,最强大
- @Resourse:j2ee——是java的标准,有更强的拓展性(别的容器框架也能使用)
实验18
使用Spring的单元测试:
步骤
①导包:spring-test-4.0.0.RELEASE.jar
②使用@ContextConfiguration(locations="")指定Spring配置文件的位置
③使用@RunWith(SpringJUnit4ClassRunner.class)指定使用哪种驱动进行单元测试,这里指定Spring的单元测试模块执行标注了@Test的测试方法;默认junit
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@ContextConfiguration(locations="classpath:applicationContext02.xml")
@RunWith(SpringJUnit4ClassRunner.class)
public class SpringTest {
@Autowired
public BookDao bookDao;
@Test
public void test(){
//不需要getBean()获取组件
System.out.println(bookDao);
}
}
实验19
测试泛型依赖注入★
DAO层:
public abstract class BaseDao<T> {
public abstract void save() throws SQLException;
}
@Repository
public class UserDao extends BaseDao<User>{
@Override
public void save() {
// TODO Auto-generated method stub
System.out.println("UserDao...保存用户....");
}
Service层
public class BaseService<T> {
@Autowired
private BaseDao<T> baseDao;
public void save(){
System.out.println("自动注入的dao:"+baseDao);
baseDao.save();
}
}
@Service
public class UserService extends BaseService<User>{
}
测试
@Test
public void test() {
ApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext.xml");
BookService bookService = ioc.getBean(BookService.class);
UserService userService = ioc.getBean(UserService.class);
bookService.save();
userService.save();
//父类的类型:com.atguigu.service.BaseService
//带泛型的父类类型:com.atguigu.service.BaseService<com.atguigu.bean.Book>
//Spring中可以使用带泛型的父类类型来确定这个子类的类型
System.out.println(bookService.getClass().getGenericSuperclass());
}