这篇文章给大家聊聊关于spring注解开发,以及spring自己实现注解对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。
Spring中的XML、注解、JavaConfig该如何选择你怎么看
首先注解,JavaConfig用起来方便实用,是趋势将会取代
.xml
的,应为xml有两个缺点:1、如果所有内容都配置在.xml文件中,会造成.xml文件十分庞大;文件很多,导致可读性和可维护性很低。2、开发中不断来回切换,太过麻烦,编译期间不容易发现错误
3、采用javaConfig配置代码简介方便管理和阅读。综上三点,注解Annotation和javaConfig将会取代xml
springboot事务注解执行顺序
1.配置属性2.获取监听器,发布应用开始启动事件3.初始化输入参数4.配置环境,输出banner5.创建上下文6.预处理上下文7.刷新上下文8.再刷新上下文9.发布应用已经启动事件10.发布应用启动完成事件。
自定义的Spring Boot starter如何设置自动配置注解
在了解如何设置自动配置注解之前可以先看看spring-boot的自动配置原理,了解了原理之后,在来看如何配置就很简单了;
SpringBoot自动配置
1.自动配置注解
要想使用自动配置功能,SpringBoot提供了注解@EnableAutoConfiguration,当然不需要我们配置因为在@SpringBootApplication注解中默认以及启用了;
可以看到@SpringBootApplication注解本身也有注解@EnableAutoConfiguration:
在注解@EnableAutoConfiguration中重点看一下@Import注解中使用的AutoConfigurationImportSelector类,此类是自动注解的核心类,会有条件的加载我们默认指定的配置类;这里有两个概念一个是有条件,一个是配置类,分别简单介绍一下:配置类可以简单理解就是相关组件对接SpringBoot的对接类,此类可以做一些初始化的工作;有条件表示并不是有配置类就能被对接上,是有条件的,SpringBoot默认提供了大量配置类,但并不是所有配置类都能被加载初始化的,是有条件的,比如mybatis在没有数据源的情况下,没有mybatis基础包的情况下是不能被对接的;下面首先看一下SpringBoot提供的哪些条件类;
2.条件类
SpringBoot提供了很多条件类,可以在配置中上配置注解条件类,相关条件类可以在spring-boot-autoconfigure包下的org.springframework.boot.autoconfigure.condition下找到,主要包含如下:
ConditionalOnBean:当前容器有指定Bean的条件下;ConditionalOnClass:当前类路径下有指定类的条件下;ConditionalOnCloudPlatform:当指定了云平台的时候;ConditionalOnExpression:SpEL表达式作为判断条件;ConditionalOnJava:JVM版本作为判断条件;ConditionalOnJndi:在JNDI存在的条件下查找指定的位置;ConditionalOnMissingBean:当容器里没有指定Bean的情况下;ConditionalOnMissingClass:当类路径下没有指定的类的条件下;ConditionalOnNotWebApplication:当前项目不是WEB项目的条件下;ConditionalOnProperty:当前应用是否配置了指定属性指定的值;ConditionalOnResource:只有当指定的资源位于类路径下;ConditionalOnSingleCandidate:bean工厂中只有一个或者有多个情况下是主要的候选bean;ConditionalOnWebApplication:当前项目是WEB项目的条件下。以上是注解类,注解本身没有功能,只是提供标记的功能,具体功能在@Conditional中指定的,比如ConditionalOnBean注解如下所示:
相关功能的实现就在OnBeanCondition类中,同样其他注解类的实现类也在包org.springframework.boot.autoconfigure.condition下找到;
3.自动配置过程
Springboot应用启动过程中使用ConfigurationClassParser分析配置类,此类中有一个processImports方法,此方法用来处理@Import注解,在@EnableAutoConfiguration注解存在@Import注解,这时候会实例化注解中的AutoConfigurationImportSelector,在其内部有一个AutoConfigurationGroup内部类,内部类有两个核心方法分别是:process和selectImports;
此方法主要获取经过条件过滤之后可用的自动配置类,主要调用AutoConfigurationImportSelector中的getAutoConfigurationEntry完成的:
首先获取了所有备选的自动配置类,然后删除了重复和被排除的类,最后通过条件进行筛选出可用的配置类,下面分别看一下,首先看一下如何获取所有备选的配置类:
通过SpringFactoriesLoader获取类路径下META-INF/spring.factories文件中key为org.springframework.boot.autoconfigure.EnableAutoConfiguration的配置类,可以看一下spring-boot-autoconfigure.jar中的spring.factories内容:
当然这里只是截取了其中一个类路径jar下的部分配置,获取所有配置类之后进行去重,去被排除的类,然后进行条件过滤,下面重点看一下:
此方法大致就是首先获取配置的AutoConfigurationImportFilter,然后对之前获取的所有配置类进行过滤,最后返回过滤之后的配置类;AutoConfigurationImportFilter同样也是通过SpringFactoriesLoader类进行加载类路径下META-INF/spring.factories,只不过当前的key是:org.springframework.boot.autoconfigure.AutoConfigurationImportFilter,可以看一下SpringBoot默认配置的filter:
可以看到Filter其实就是上文介绍的条件类,这里默认了OnBeanCondition,OnClassCondition以及OnWebApplicationCondition,已这里使用的Mybatis为例看一下MybatisAutoConfiguration的注解:
可以看到其中有用到@ConditionalOnClass,表示必须提供SqlSessionFactory和SqlSessionFactoryBean类的情况下才加载此配置类,而整两个是正式Mybatis基础包中提供的;有了基础包还不行,还需要DataSource,而且DataSource必须在MybatisAutoConfiguration实例化之前初始化好,SpringBoot是如何实现,继续看另外一个核心方法selectImports():
首先是对被排除类的一个过滤,然后接下来重点看一下对配置类进行排序的一个方法,具体操作在类AutoConfigurationSorter中进行的,具体方法为getInPriorityOrder():
首先使用order进行排序,然后使用@AutoConfigureBefore和@AutoConfigureAfter就行排序;order其实就是通过注解@AutoConfigureOrder进行排序的,值是一个整数,结构类似如下:
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE+10)@AutoConfigureBefore和@AutoConfigureAfter字面意思也很好理解,指定在其他配置类之前和之后,所以可以看到在MybatisAutoConfiguration中有如下配置:
表示在DataSourceAutoConfiguration配置类加载之后才会加载Mybatis配置类,这样就解决了依赖关系;还有上文提到的Mybatis操作数据库依赖的SqlSessionFactory和SqlSession,都在MybatisAutoConfiguration进行了初始化操作;SpringBoot本身其实以及提供了大量常用组件的自动配置类,我们只需要提供满足的特定条件,SpringBoot自动会帮我加载初始化等操作;
下面用一个简单的实例来看看如何自定义一个自动配置类;
自定义配置类
接下来我们用很简单的实例来看一下自定义的流程,一个格式化大写消息的实例;
1.pom文件引入依赖
Spring官方Starter通常命名为spring-boot-starter-{name}如spring-boot-starter-web,Spring官方建议非官方Starter命名应遵循{name}-spring-boot-starter的格式;
2.服务类和属性配置类
属性类提供了type参数可以在application.properties中配置,可配置值包括:upper,lower;
3.自动配置类和创建spring.factories文件
这个就是自定义的自动配置类,SpringBoot启动的时候会根据条件自动初始化;最后在resources/META-INF/下创建spring.factories文件:
4.测试
在其他SpringBoot中可以引入上面创建的项目,引入方式也很简单:
同时在application.properties配置格式化类型:
启动应用,浏览器访问http://localhost:8888/format?word=hello,结果为:HELLO
以上分析了一下springboot的自动配置原理,并自定义一个自动配置类,并且运行,相信对你有所帮助;
更多可以参考本人之前的文章:https://www.toutiao.com/i6749752249532023309/
springboot跳转页面的注解是哪个
在SpringBoot中,用于跳转页面的注解是`@RequestMapping`,其主要作用是将HTTP请求映射到控制器的处理方法,并可以指定返回的视图名称或视图路径。
但是在SpringBoot2.0之后,为了规范,Spring官方推荐使用更为明确的注解`@GetMapping`、`@PostMapping`等来替代`@RequestMapping`来标记请求的方法。所以,一般情况下我们会使用`@GetMapping`注解来进行页面的跳转。
spring使用注解时报错,该怎么办
解决方案:
1、在这需要说明的是,由于后台从始至终没有报任何的错误,故我的文章里不会有出错的贴图,有人就会说了,为什么不把自己的配置文件贴给大家看呢,我认为没有必要,因为接下来我会给大家讲解排错方法,并且贴上已经访问成功的完整代码贴图。其实刚开始一遇见这样的错误,自己也排查了一边没有任何的发现,于是就网上百度各种搜索,其中也搜到一些结果,按照提示操作一通都没有成功。这里我总结一下网上各种帖子的解决方案:
1、大量文章都是千篇一律的说处理器映射器和处理器适配器以及视图解析器没有配置好,于是教你怎么去配置处理器映射器,这里我总结一个处理器映射器和适配器以及视图解析器的配置
1.1、非注解的处理器映射器和适配器配置,注意:在这里处理器映射器的配置必须和处理器适配器的配置是成对的,还有必须在配置文件里声明注入你的controller,并且这个controller必须实现Controller接口。非注解的配置访问是根据声明注入的beanname来进行映射处理的,必须有name,而且name的值必须有根符号(“/”)。
1.2、注解的处理器映射器和适配器配置。注解的controller类必须使用@Controller进行注解,类中的方法使用@RequestMapping("")进行注解。注解的配置方式还有一种,即<mvc:annotation-driven/>注解驱动配置,这样更方便,实际项目也是这样使用的。
1.3、视图解析器的配置。
至此,springmvc的controller需要的处理器映射器和处理器适配器以及视图解析器的配置已经完成,当然实际要运行的时候还必须要有Controller包扫描,不然你的程序在实例化完sqlSessionFactory后会一直卡在那里,不做任何操作,页面也不会有任何的反映。
2、这网上的第二种解决方法说的最多的就是我上面说的Controller的包扫描没有加或者包扫描的配置是错误的,这如果说其他配置都OK的话,如果没有加包扫描,那么他不回报任何的错误,但是会输出日志,创建SqlSessionFactory的日志是有的,不会什么信息都没有。有的人将Controller的包扫描加成这样
<context:component-scanbase-package="com.springmvc.ssm.controller.*"/>也是什么都没有的。正确的包扫描是这样的:
3、当然也有说jar包没有,这也有可能是有的,没有jar包报404很正常的。这里要说的是如果出现404,你的判断是jar包没有,那你就得去你的项目发布路径下的WEB-INF下的lib文件夹去找jar包,而不是你的eclipse里看有没有。更需要注意的是,有人在tomcat运行设置过发布路径,那就必须在你设置的发布路径下找,我的设置为tomcat的安装目录下的webapps下了。
4、其实忘了一个最多的说法,那就是说你的请求地址是错误的,这个只能说自己认真排查,一般人在出现404的时候第一反应就是请求地址的核对,所以这个我也不说了。但是在这里我强调一个现象,就是你的请求地址是正确的,但是你的目录里没有Controller里的方法返回的页面,这样也会出现404,但是这个404和之前的404是不一样的。比如我在我的testController的items映射的方法里返回的itemsLists,实际我的jsp下的JSP文件没有一个itemsLists.jsp,那么页面的错误就会是这样的:
5、还有一种解决办法说web.xml配置DispatcherServlet的时候servlet的映射关系<url-pattern>配置不正确,应该将<url-pattern>/*</url-pattern>改为<url-pattern>/*</url-pattern>,去掉根号后面的星号,当然如果确实这样写了,那这也是一种解决办法。
spring如何扫描configuration注解
Spring的@Configuration注解用于定义配置类,可替换XML配置文件,被注解的类内部包含有一个或者多个被@Bean注解的方法,这些方法将会被ApplicationContext上下文类进行扫描,并构建对应的bean,加入到Spring容器之中进行管理。
好了,关于spring注解开发和spring自己实现注解的问题到这里结束啦,希望可以解决您的问题哈!