1.把service和dao对象创建,并在类中添加创建对象的注解
//接口:UserDao
public interface UserDao {
public void add();
}
//接口实现类
@Repository(value = "userDaoImpl1")
//根据名称注入
//@Component,@Controller,@Service 都可以,这里为了和其他地方区别开
public class UserDaoImpl implements UserDao {
@Override
public void add() {
System.out.println("dao add...");
}
}
2.在Service里面注入Dao对象,在service类添加dao类型属性,在属性上面使用注解
@Service
//@Component,@Controller,@Repository 都可以
public class UserService {
//定义dao类型属性
//不需要添加set方法
//添加注入属性注解
@Autowired //根据类型进行注入
@Qualifier(value = "userDaoImpl1")
//上面两行可以用@Resourse(name="userDaoImpl1")替代
private UserDao userDao;
public void add(){
System.out.println("service add...");
userDao.add();
}
}
xml配置文件:
<!--开启组件扫描
1 如果扫描多个包,多个包使用逗号隔开
2 扫描包上层目录
-->
<context:component-scan base-package="ysy1_spring5.service,ysy1_spring5.dao"></context:component-scan>
测试类:
@Test
public void testService(){
ApplicationContext context
=new ClassPathXmlApplicationContext("bean0.xml");
UserService userService=context.getBean("userService",UserService.class);
System.out.println(userService);
userService.add();
}
结果如下:
其中遇到了bug:
Exception encountered during context initialization - cancelling refre
原因是导包时,少导入了一个包
@Qualifier(value = "userDaoImpl1")的作用:如果一个接口有多个实现类,可以用名称来找其中指定的类
@Resourse(name="userDaoImpl1")注意是在javax包中,是java的扩展包中,所以不建议用这个
用纯注解开发:
1.创建配置类,替代xml文件
创建一个包,创建一个SpringConfig类
@Configuration //作为配置类,替代xml配置文件
@ComponentScan(basePackages ={"ysy1_spring5"} )//开启组件扫描
public class SpringConfig {
}
2.编写测试类
@Test
public void testService2(){
//加载配置类
ApplicationContext context
=new AnnotationConfigApplicationContext(SpringConfig.class);//这里和上面不同
UserService userService=context.getBean("userService",UserService.class);
System.out.println(userService);
userService.add();
}
遇到了一个bug:一开始类名定义为springConfig,编译一直说是NoSuchBeanDefinitionException: No bean named ‘userService’ is defined
但是并没有发现错误
后来我把类名改成SpringConfig后,编译通过,原来是类名没有遵循驼峰命名法
之后我尝试把这个类改成别的小写开头的名字,系统给我自动首字母大写了