1.对象创建的注解

  • @Component
    用于实例化对象,相当于配置文件中的
    它支持一个属性value,相当于xml中bean的id。如果不写,默认值为类名的首字母小写
    @Controller @Service @Repository
    这三个注解的功能跟@Component类似,他们分别标注在不同的层上。
  • @Controller 标注在表现层的类上
  • @Service 标注在业务层的类上
  • @Repository 标注在持久层的类上
    推荐使用后三个,当一个类实在不好归属在这三个层上时,再使用@Component

2.对象生存范围的注解

  • @Scope用于指定bean的作用范围(单例和多例),相当于配置文件中的<bean scope=""> </bean>

3.对象生命周期的注解

  • @PostConstruct @PreDestroy 这两个注解标注方法分别在对象的创建之后和销毁之前执行。
    相当于

4.对象依赖注入的注解

  • @Autowired
    这个注解表示依赖注入,他可以标注在属性上,也可以标注在方法上,当@Autowired标注在属性上的时候,属性对应的set方法可以省略不写
    Spring会在他的IOC容器中按照被标注属性的类型进行寻找
    如果找不到,就会报错
    如果找到了,而且正好找到了一个,那么就进行依赖注入
    如果找到了,但是找到了多个,它会再按照属性名称进行匹配
    如果匹配上了就注入
    如果匹配不上就报错
  • @Qualifier
    要跟@Autowired联合使用,代表在按照类型匹配的基础上,再按照名称匹配
  • @Resource
    此注解由java提供,而且JDK9版本以后废弃了
    Spring会在他的IOC容器中先按照属性名称进行寻找
    如果找到了,就进行依赖注入
    如果找不到,再按照类型进行匹配
    如果正好匹配到一个,就注入
    如果匹配到多个,就报错
  • 注意: @Resource(name = "userDaoImpl1") 如果直接使用name指定名称,他就只会按照名称匹配

注解

  • 向Spring容器中放入对象 @Component @Controller @Service @Repository
  • 从Spring容器中获取对象 @Autowired

5.新注解总结

  • @ComponentScan
    组件扫描注解。 相当于xml配置文件中的<context:component-scan base-package=""/>
  • @Bean(重点)
    该注解只能写在方法上,表明使用此方法创建一个对象,并且放入spring容器。它支持一个name属性,用于给生成的bean取一个id。
  • @PropertySource
    用于引入其它的properties配置文件
  • @Import
    在一个配置类中导入其它配置类的内容
  • @Configuration
    被此注解标注的类,会被Spring认为是配置类。Spring在启动的时候会自动扫描并加载所有配置类,然后将配置类中bean放入容器

6.ThreadLocal介绍

  • 本地局部变量,它的底层就是一个特殊的map结构,此map的键是固定的,是当前线程对象,值是任意对象
    常见方法:
    ​ set(value) 向ThreadLocal中存入值
    ​ get() 从ThreadLocal取出值
    ​ remove() 移除ThreadLocal中跟当前线程相关的数据

(1)ThreadLocal使用场合主要解决多线程中数据数据因并发产生不一致问题。ThreadLocal为每个线程的中并发访问的数据提供一个副本,通过访问副本来运行业务,这样的结果是耗费了内存,单大大减少了线程同步所带来性能消耗,也减少了线程并发控制的复杂度。
(2)ThreadLocal不能使用原子类型,只能使用Object类型。ThreadLocal的使用比synchronized要简单得多。
(3)ThreadLocal和Synchonized都用于解决多线程并发访问。但是ThreadLocal与synchronized有本质的区别。synchronized是利用锁的机制,使变量或代码块在某一时该只能被一个线程访问。而ThreadLocal为每一个线程都提供了变量的副本,使得每个线程在某时间访问到的并不是同一个对象,这样就隔离了多个线程对数据的数据共享。而Synchronized却正好相反,它用于在多个线程间通信时能够获得数据共享。
(4)Synchronized用于线程间的数据共享,而ThreadLocal则用于线程间的数据隔离。
(5)ThreadLocal并不能替代synchronized,它们处理不同的问题域。Synchronized用于实现同步机制,比ThreadLocal更加复杂。