Spring注解开发之@Resource、@Scope基础知识及案例分析
总结:
(1)如果Action层非要@Controller("…"),其中…代表id,@Controller("…")也就是为一个bean创建一个id。那么需要在Action中对应的属性上面添加:
@Autowired//spring自动注入userService赋值
@Qualifier("myUserService")
例如:
@Controller
public class UserAction{
//@Autowired//spring自动注入userService赋值
//@Qualifier("myUserService")
@Resource(name = "myUserService")
private UserService userService;
public UserService getUserService() {
return userService;
}
public void setUserService(UserService userService) {
this.userService = userService;
}
public void save(User user){
System.out.println("action save方法 ");
userService.add(user);
}
}
注意: @Resource(name = “myUserService”)可以代替上面的那两行代码
还要在Service层里添加@Service(“myUserService”)
@Service("myUserService")
public class UserServiceImpl implements UserService {
@Autowired //spring会自动注入userDao赋值
private UserDao userDao;
@Override
public void add(User user) {
System.out.println("service 添加用户:" + user);
//调用dao
userDao.add(user);
}
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public void add() {
System.out.println("创建用户...." + name);
}
public UserServiceImpl() {
System.out.println("UserServiceImpl()调用了");
}
}
}
(2)Autowired是根据类型注入值,如果你是一个接口,从容器找接口实现类,然后把实现类给注入;如果你就是一个类,就查找类。
(3)指定ID来注入@Qualifier(“myUserService”)用的比较少;指定名称注入用得也很少,@Resource(name = “myUserService”);Autowired是根据类型注入值用得比较多
(4)@Scope注解是springIoc容器中的一个作用域,在 Spring IoC 容器中具有以下几种作用域:基本作用域singleton(单例)、prototype(多例),Web 作用域(reqeust、session、globalsession),自定义作用域。
注意:
(1)
a.singleton单例模式 – 全局有且仅有一个实例
b.prototype原型模式 – 每次获取Bean的时候会有一个新的实例
c.request – request表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP request内有效
d.session – session作用域表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP session内有效
e.globalsession – global session作用域类似于标准的HTTP Session作用域,不过它仅仅在基于portlet的web应用中才有意义
(2)
@Scope注解默认的singleton实例,singleton实例的意思不管你使用多少次在springIOC容器中只会存在一个实例。如果要创建多例,那么需要设置@Scope(value=“prototype”)
(3)@Scope注解的使用场景
现在在开发中绝大部分就是利用到@Scope注解的单例模式。spring默认的类型也是singleton,singleton虽然保证了全局是一个实例,对性能有所提高,但是如果实例中有非静态变量时,会导致线程安全问题,共享资源的竞争
当设置为prototype时:每次连接请求,都会生成一个bean实例,也会导致一个问题,当请求数越多,性能会降低,因为创建的实例,导致GC频繁,gc时长增加