注解
注解对象
使用context命名空间,通知spring扫描指定包下的所有bean类,进行注解解析。
- applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.me.annotation" />
</beans>
- UserDaoImpl
@Repository
public class UserDaoImpl implements UserDao{
@Override
public void save() {
System.out.println("UserDaoImpl...");
}
}
- UserServiceImpl
@Service
public class UserServiceImpl implements UserService{
@Autowired
private UserDao userDao;
@Override
public void save() {
System.out.println("UserServiceImpl...");
this.userDao.save();
}
}
- UserController
@Controller("userController")
public class UserControllerImpl implements UserController{
@Autowired
private UserService userService;
@Override
public void save() {
System.out.println("UserControllerImpl...");
this.userService.save();
}
}
@Repository、@Service、@Controller功能和@Component是一样的,都可以将对象注解到容器,且都可以给对象指定名字,如@Service(“userService”)。
修改对象的作用范围
值类型注入
- 方拾一,通过set方法赋值,推荐使用
- 方式二,通过反射的field赋值,破坏了封装性,但是更直观,因此也被更多使用。
如果只给一个属性赋值,并且该属性是value,则“value=”可以省略,如@Value(“张三”)、@Repository(“userDao”)。
引用类型三种注入方式
- 自动装配
问题:如果存在多个类型一致的对象,则无法选择具体注入哪一个对象。 - 手动注入,指定bean对象名称。如果存在多个类型一致的对象,推荐使用。
- 自动装配且指定名称
初始化和销毁方法
- 初始化和销毁方法
- 测试类
- 运行结果
问题:userController没有被销毁,是因为其设置了作用域为“prototype”。prototype每次都会创建新的对象,但是不管销毁。