@Resource注解和@Autowired的区别以及讲解@Scope
1.不同的包下
@Resource:在javax的包下 是Java规范的注解
作用:按照名称进行注入
@Autowired:在Spring包下定义的(常用)
作用:按照类型进行注入
例如我们这里有个Service实现类
@Service("myUserService") //给bean一个id
public class UserServiceImpl implenets UserService{
}
在我们Controller层里面怎么进行注入呢 有两种方式
@Controller
public class UserController{
@Autowired //Spring自动注入 userService 根据类型进行注入
@Qualifier("myUserService") //根据指定的id注入属性 一般和@Autowired一同出现 因为可能类型一样 名字一样,那么就要拿名字区分
private UserSerive userSerive;
}
@Controller
public class UserController{
@Resource("myUserService") //默认按照名称去找
private UserSerive userSerive;
}
二、在认识一个重要的注解@Scope注解 它可以来设置组件作用域 默认是单实例
@Scope取值(最常用的是前面两个)
- prototype:多实例的:ioc容器启动并不会去调用方法创建对象放在容器中,每次获取的时候才会调用方法创建对象。
- singleton:单实例的(默认值):ioc容器启动会调用方法创建对象放到ioc容器中。以后每次获取都是直接从容器中拿
- request:同一次请求创建一个实例
- session:同一个session创建一个实例
示例:不使用@Scope标签 注意:这里Spring默认是单例的 可以看到打印出的对象地址是一致的
这里我们使用@Scope注解 并且取值为prototype 变为多例
这里我们很明显发现 地址发生了改变 两个地址不一致了 这个就是多例。
单例、多例的介绍
单例就是所有的请求都用一个对象来处理,比如我们常用的service和dao层的对象通常都是单例的,而多例则指每个请求用一个新的对象来处理,比如Controller;
单例的好处:
我们没必要每个请求都新建一个对象,这样子既浪费CPU又浪费内存;
多例的好处:
是为了防止并发问题;即一个请求改变了对象的状态,此时对象又处理另一个请求,而之前请求对对象状态的改变导致了对象对另一个请求做了错误的处理;
应用场景:
当对象含有可改变的状态时(更精确的说就是在实际应用中该状态会改变),则用多例;
单例其实就在内存中该对象只有一个内存对应地址。无论你多少个线程访问那个对象,都是同一个地址。这样节省内存
总而言之,举个例子 形象表明:你
吃饭吃完,碗不去刷,继续去装西瓜吃,然后在不刷,继续去装土吃,就是单例。
吃饭吃完,你把碗摔了,换了个大碗去装西瓜吃,然后你嫌不好吃,又换了个更大的碗装土吃,就是多例。
你以为讲到这里 你就可以关机吃饭了,不不不,这才刚开始呢,那么趁热打铁,我们接下来在学两个注解吧,这两个注解也很有作用的哟。
接下来讲解的是Bean初始化 销毁的注解@PostConstruct @PreDestroy
这个时候你可能会想 这有什么学的 不就是Bean的生命周期,这个不重要,开发都用不到,如果你想到这 那你错了 我问你 你刚学JDBC数据库连接时候 是不是有一个首先连接驱动? 那个就是初始化 最后你操作完数据库后 是不是有个关闭连接和一个对象? 那就是销毁了。那么这里也是 你可以在Bean初始化方法指定 需要初始化的资源 销毁时候 将其要关闭的资源关闭掉。讲到这里 是不是觉得很重要了呢 废话不多说 直接上硬货
XML配置的初始化和销毁为 <bean init-method=" " destroy-method=" "></bean>
@PostConstruct 类似于XML中的 init-method=" " 作用:自定义初始化
@PreDestroy 类似于XML中的 destroy-method="" 作用:自定义销毁
直接上代码 定义了初始化 和销毁的注解
好了 好了 就到这里吧,在写下去,我头发要没了。