spring注解详解(spring 注解是有什么作用)

本文目录
spring 注解是有什么作用
spring 注解可以减少xml配置;
注释配置相对于 XML 配置具有很多的优势:
它可以充分利用 Java 的反射机制获取类结构信息,这些信息可以有效减少配置的工作。如使用 JPA 注释配置 ORM 映射时,我们就不需要指定 PO 的属性名、类型等信息,如果关系表字段和 PO 属性名、类型都一致,您甚至无需编写任务属性映射信息——因为这些信息都可以通过 Java 反射机制获取。
注释和 Java 代码位于一个文件中,而 XML 配置采用独立的配置文件,大多数配置信息在程序开发完成后都不会调整,如果配置信息和 Java 代码放在一起,有助于增强程序的内聚性。而采用独立的 XML 配置文件,程序员在编写一个功能时,往往需要在程序文件和配置文件中不停切换,这种思维上的不连贯会降低开发效率。
spring注解怎么实现的
【Spring如何使用注解机制完成自动装配】
Java实例构造时会调用默认父类无参构造方法,Spring正是利用了这一点,让“操作元素的代码“得以执行。
【两种处理策略】
(1)类级别的注解:如@Component、@Repository、@Controller、@Service以及JavaEE6的@ManagedBean和@Named注解,都是添加在类上面的类级别注解。
Spring容器根据注解的过滤规则扫描读取注解Bean定义类,并将其注册到Spring IoC容器中。
(2)类内部的注解:如@Autowire、@Value、@Resource以及EJB和WebService相关的注解等,都是添加在类内部的字段或者方法上的类内部注解。
SpringIoC容器通过Bean后置注解处理器解析Bean内部的注解。
Spring实现@Autowire解析和注入的核心的类是通过AutowiredAnnotationBeanPostProcessor来实现的。
我们可以通过其方法列表看出,其中对字段的注入,对属性的注入,还有选择相应的构造方法来注入。
1,从构造方法的缓存中查询其构造方法
2,若缓存中不存在,则根据反射获取所有构造方法
3,遍历所有构造方法,查询器是否含有@Autowired属性
4,判断Autowired注解中指定了required属性 (required属性就是判断是否强依依赖)若存在required就使用默认构造方法。
5,返回指定的构造方法
注入的时候则是通过inject方法来实现。
================================================================================================================================
Spring对注解的支持主要都是通过反射来获取相应的注解,来做相应的处理,我们的工程中大部分都是使用@Service 和@Autowired来使用,其实我们还可以使用到其他的注解来加快我们的开发,满足我们的多样性需求。
annotation是挺简单的东西.其实就是个声明。然后通过反射去取那些声明了值。
autowire其实也是这个意思。通过反射去看你autowire的方式,通过定义的方式,去给你声明的变量赋值。
通过java的反射机制相关的API来访问Annotation信息。
相关类(框架或工具中的类)根据这些信息来决定如何使用该程序元素或改变它们的行为。
Java语言解释器在工作时会忽略这些Annotation,因此在JVM中这些Annotation是“不起作用”的,只能通过配套的工具才能对这些Annotation类型的信息进行访问和处理。
注解本身不做任何事情,只是像xml文件一样起到配置作用。
注解代表的是某种业务意义,注解背后处理器的工作原理如上源码实现:
——首先解析所有属性,判断属性上是否存在指定注解。
——如果存在则根据搜索规则取得bean,然后利用反射原理注入。
——如果标注在字段上面,也可以通过字段的反射技术取得注解,根据搜索规则取得bean,然后利用反射技术注入。
================================================================================================================================
Spring 3.0 新增了另外两个实现类:AnnotationConfigApplicationContext 和 AnnotationConfigWebApplicationContext。从名字便可以看出,它们是为注解而生,直接依赖于注解作为容器配置信息来源的 IoC 容器初始化类。由于 AnnotationConfigWebApplicationContext 是 AnnotationConfigApplicationContext 的 web 版本,其用法与后者相比几乎没有什么差别,因此本文将以 AnnotationConfigApplicationContext 为例进行讲解。
我们需要在用于指定配置信息的类上加上 @Configuration 注解,以明确指出该类是 Bean 配置的信息源。并且 Spring 对标注 Configuration 的类有如下要求:
配置类不能是 final 的;
配置类不能是本地化的,亦即不能将配置类定义在其他类的方法内部;
配置类必须有一个无参构造函数。
AnnotationConfigApplicationContext 将配置类中标注了 @Bean 的方法的返回值识别为 Spring Bean,并注册到容器中,受 IoC 容器管理。@Bean 的作用等价于 XML 配置中的 《bean/》 标签。
在一般的项目中,为了结构清晰,通常会根据软件的模块或者结构定义多个 XML 配置文件,然后再定义一个入口的配置文件,该文件使用 《import/》 将其他的配置文件组织起来。最后只需将该文件传给 ClassPathXmlApplicationContext 的构造函数即可。
针对基于注解的配置,Spring 也提供了类似的功能,只需定义一个入口配置类,并在该类上使用 @Import 注解引入其他的配置类即可,最后只需要将该入口类传递给 AnnotationConfigApplicationContext。
@Configuration
@Import({BookStoreServiceConfig.class,BookStoreDaoConfig.class})
public class BookStoreConfig{ … }
================================================================================================================================
spring 注解实现原理
一、注解顾名思义,就是类似于添加注释,但是又不跟注释完全一样,因此,我们可以将它理解为将类或者方法与特定的信息进行关联。
二、那么注解如何实现?
1、接口使用@interface定义。
2、通过继承以下注解,实现功能(ujiuye):
元注解@Target,@Retention,@Documented,@Inherited
spring有哪些常用注解
使用注解之前要开启自动扫描功能
其中base-package为需要扫描的包(含子包)。
1《context:component-scan base-package=“cn.test“/》@Configuration把一个类作为一个IoC容器,它的某个方法头上如果注册了@Bean,就会作为这个Spring容器中的Bean。
@Scope注解 作用域
@Lazy(true) 表示延迟初始化
@Service用于标注业务层组件、
@Controller用于标注控制层组件(如struts中的action)
@Repository用于标注数据访问组件,即DAO组件。
@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
@Scope用于指定scope作用域的(用在类上)
---------------jsr250----
@PostConstruct用于指定初始化方法(用在方法上)
@PreDestory用于指定销毁方法(用在方法上)
@Resource 默认按名称装配,当找不到与名称匹配的bean才会按类型装配。
----------
@DependsOn:定义Bean初始化及销毁时的顺序
@Primary:自动装配时当出现多个Bean候选者时,被注解为@Primary的Bean将作为首选者,否则将抛出异常
@Autowired 默认按类型装配,如果我们想使用按名称装配,可以结合@Qualifier注解一起使用。如下:
@Autowired @Qualifier(“personDaoBean“) 存在多个实例配合使用
@PostConstruct 初始化注解
@PreDestroy 摧毁注解 默认 单例 启动就加载??
@Async异步方法调用,需要添加以下代码:
为了让@Async注解能够生效,还需要在Spring Boot的主程序中配置@EnableAsync
在Spring中,基于@Async标注的方法,称之为异步方法;
这些方法将在执行的时候,将会在独立的线程中被执行,
调用者无需等待它的完成,
即可继续其他的操作。
@Async所修饰的函数不要定义为static类型,这样异步调用不会生效
@ComponentScan(basePackages = “com.xzc.“)
@EnableAutoConfiguration
@SpringBootApplication
@PropertySource({“classpath:application.properties“, “classpath:xzc.properties“})
@ImportResource(“classpath:ws-client.xml“)
@EnableRedisHttpSession
@EnableAspectJAutoProxy
@EnableCaching
@EnableAsync
@Configuration@EnableScheduling 启动定时任务
@Entity注释指名这是一个实体Bean
1、 @PathVariable
当使用@RequestMapping URI template 样式映射时, 即 someUrl/{paramId}, 这时的paramId可通过 @Pathvariable注解绑定它传过来的值到方法的参数上
@Controller
@RequestMapping(“/owners/{ownerId}“)
public class RelativePathUriTemplateController {
@RequestMapping(“/pets/{petId}“)
public void findPet(@PathVariable String ownerId, @PathVariable String petId, Model model) {
// implementation omitted
}
}
上面代码把URI template 中变量 ownerId的值和petId的值,绑定到方法的参数上。
若方法参数名称和需要绑定的uri template中变量名称不一致,需要在@PathVariable(“name“)指定uri template中的名称。
spring的注解有哪些
多个包逗号隔开。
1、@Component
@Component
是所有受Spring 管理组件的通用形式,@Component注解可以放在类的头上,@Component不推荐使用。
2、@Controller
@Controller对应表现层的Bean,也就是Action,例如:
1 @Controller
2 @Scope(“prototype“)
3 public class UserAction extends BaseAction《User》{
4 ……
5 }
使用@Controller注解标识UserAction之后,就表示要把UserAction交给Spring容器管理,在Spring容器中会存在一个名字为“userAction“的action,这个名字是根据UserAction类名来取的。注意:如果@Controller不指定其value【@Controller】,则默认的bean名字为这个类的类名首字母小写,如果指定value【@Controller(value=“UserAction“)】或者【@Controller(“UserAction“)】,则使用value作为bean的名字。
这里的UserAction还使用了@Scope注解,@Scope(“prototype“)表示将Action的范围声明为原型,可以利用容器的scope=“prototype“来保证每一个请求有一个单独的Action来处理,避免struts中Action的线程安全问题。spring 默认scope 是单例模式(scope=“singleton“),这样只会创建一个Action对象,每次访问都是同一Action对象,数据不安全,struts2 是要求每次次访问都对应不同的Action,scope=“prototype“ 可以保证当有请求的时候都创建一个Action对象
3、@ Service
@Service对应的是业务层Bean,例如:
1 @Service(“userService“)
2 public class UserServiceImpl implements UserService {
3 ………
4 }
@Service(“userService“)注解是告诉Spring,当Spring要创建UserServiceImpl的的实例时,bean的名字必须叫做“userService“,这样当Action需要使用UserServiceImpl的的实例时,就可以由Spring创建好的“userService“,然后注入给Action:在Action只需要声明一个名字叫“userService”的变量来接收由Spring注入的“userService“即可,具体代码如下:
1 // 注入userService
2 @Resource(name = “userService“)
3 private UserService userService;
注意:在Action声明的“userService”变量的类型必须是“UserServiceImpl”或者是其父类“UserService”,否则由于类型不一致而无法注入,由于Action中的声明的“userService”变量使用了@Resource注解去标注,并且指明了其name = “userService“,这就等于告诉Spring,说我Action要实例化一个“userService”,你Spring快点帮我实例化好,然后给我,当Spring看到userService变量上的@Resource的注解时,根据其指明的name属性可以知道,Action中需要用到一个UserServiceImpl的实例,此时Spring就会把自己创建好的名字叫做“userService“的UserServiceImpl的实例注入给Action中的“userService”变量,帮助Action完成userService的实例化,这样在Action中就不用通过“UserService userService = new UserServiceImpl();”这种最原始的方式去实例化userService了。如果没有Spring,那么当Action需要使用UserServiceImpl时,必须通过“UserService userService = new UserServiceImpl();”主动去创建实例对象,但使用了Spring之后,Action要使用UserServiceImpl时,就不用主动去创建UserServiceImpl的实例了,创建UserServiceImpl实例已经交给Spring来做了,Spring把创建好的UserServiceImpl实例给Action,Action拿到就可以直接用了。Action由原来的主动创建UserServiceImpl实例后就可以马上使用,变成了被动等待由Spring创建好UserServiceImpl实例之后再注入给Action,Action才能够使用。这说明Action对“UserServiceImpl”类的“控制权”已经被“反转”了,原来主动权在自己手上,自己要使用“UserServiceImpl”类的实例,自己主动去new一个出来马上就可以使用了,但现在自己不能主动去new“UserServiceImpl”类的实例,new“UserServiceImpl”类的实例的权力已经被Spring拿走了,只有Spring才能够new“UserServiceImpl”类的实例,而Action只能等Spring创建好“UserServiceImpl”类的实例后,再“恳求”Spring把创建好的“UserServiceImpl”类的实例给他,这样他才能够使用“UserServiceImpl”,这就是Spring核心思想“控制反转”,也叫“依赖注入”,“依赖注入”也很好理解,Action需要使用UserServiceImpl干活,那么就是对UserServiceImpl产生了依赖,Spring把Acion需要依赖的UserServiceImpl注入(也就是“给”)给Action,这就是所谓的“依赖注入”。对Action而言,Action依赖什么东西,就请求Spring注入给他,对Spring而言,Action需要什么,Spring就主动注入给他。
4、@ Repository
@Repository对应数据访问层Bean ,例如:
1 @Repository(value=“userDao“)
2 public class UserDaoImpl extends BaseDaoImpl《User》 {
3 ………
4 }
@Repository(value=“userDao“)注解是告诉Spring,让Spring创建一个名字叫“userDao”的UserDaoImpl实例。
当Service需要使用Spring创建的名字叫“userDao”的UserDaoImpl实例时,就可以使用@Resource(name = “userDao“)注解告诉Spring,Spring把创建好的userDao注入给Service即可。
1 // 注入userDao,从数据库中根据用户Id取出指定用户时需要用到
2 @Resource(name = “userDao“)
3 private BaseDao《User》 userDao;

更多文章:
repercussions(都是余波,repercussions和aftermath有什么区别啊)
2026年10月11日 09:00
dropdownlist 绑定(DropDownList 绑定所有项 并 显示指定项)
2026年10月11日 08:50
易语言网页api接口怎么调用(易语言,怎么读取网页json的api)
2026年10月11日 08:00
majority of(the majority of 和 a majority of的区别以及用法例句)
2026年10月11日 07:40
another time(another time和other time的区别)
2026年10月11日 05:00





