当前位置: 首页 > news >正文

wordpress 导出excelseo基本概念

wordpress 导出excel,seo基本概念,网络推广工资,招聘网站如何做SEO前言在庞大的java体系中#xff0c;spring有着举足轻重的地位#xff0c;它给每位开发者带来了极大的便利和惊喜。我们都知道spring是创建和管理bean的工厂#xff0c;它提供了多种定义bean的方式#xff0c;能够满足我们日常工作中的多种业务场景。那么问题来了#xff0… 前言在庞大的java体系中spring有着举足轻重的地位它给每位开发者带来了极大的便利和惊喜。我们都知道spring是创建和管理bean的工厂它提供了多种定义bean的方式能够满足我们日常工作中的多种业务场景。那么问题来了你知道spring中有哪些方式可以定义bean我估计很多人会说出以下三种没错但我想说的是以上三种方式只是开胃小菜实际上spring的功能远比你想象中更强大。各位看官如果不信请继续往下看。1. xml文件配置bean我们先从xml配置bean开始它是spring最早支持的方式。后来随着springboot越来越受欢迎该方法目前已经用得很少了但我建议我们还是有必要了解一下。1.1 构造器如果你之前有在bean.xml文件中配置过bean的经历那么对如下的配置肯定不会陌生bean idpersonService classcom.sue.cache.service.test7.PersonService /bean 这种方式是以前使用最多的方式它默认使用了无参构造器创建bean。当然我们还可以使用有参的构造器通过constructor-arg标签来完成配置。bean idpersonService classcom.sue.cache.service.test7.PersonServiceconstructor-arg index0 valuesusan/constructor-argconstructor-arg index1 refbaseInfo/constructor-arg /bean 其中index表示下标从0开始。value表示常量值ref表示引用另一个bean1.2 setter方法除此之外spring还提供了另外一种思路通过setter方法设置bean所需参数这种方式耦合性相对较低比有参构造器使用更为广泛。先定义Person实体Data public class Person {private String name;private int age; } 它里面包含成员变量name和agegetter/setter方法。然后在bean.xml文件中配置bean时加上property标签设置bean所需参数。bean idperson classcom.sue.cache.service.test7.Personproperty namename valuesusan/constructor-argproperty nameage value18/constructor-arg /bean 1.3 静态工厂这种方式的关键是需要定义一个工厂类它里面包含一个创建bean的静态方法。例如public class SusanBeanFactory {public static Person createPerson(String name, int age) {return new Person(name, age);} } 接下来定义Person类如下AllArgsConstructor NoArgsConstructor Data public class Person {private String name;private int age; } 它里面包含成员变量name和agegetter/setter方法无参构造器和全参构造器。然后在bean.xml文件中配置bean时通过factory-method参数指定静态工厂方法同时通过constructor-arg设置相关参数。bean classcom.sue.cache.service.test7.SusanBeanFactory factory-methodcreatePersonconstructor-arg index0 valuesusan/constructor-argconstructor-arg index1 value18/constructor-arg /bean 1.4 实例工厂方法这种方式也需要定义一个工厂类但里面包含非静态的创建bean的方法。public class SusanBeanFactory {public Person createPerson(String name, int age) {return new Person(name, age);} } Person类跟上面一样就不多说了。然后bean.xml文件中配置bean时需要先配置工厂bean。然后在配置实例bean时通过factory-bean参数指定该工厂bean的引用。bean idsusanBeanFactory classcom.sue.cache.service.test7.SusanBeanFactory /bean bean factory-beansusanBeanFactory factory-methodcreatePersonconstructor-arg index0 valuesusan/constructor-argconstructor-arg index1 value18/constructor-arg /bean 1.5 FactoryBean不知道大家有没有发现上面的实例工厂方法每次都需要创建一个工厂类不方面统一管理。这时我们可以使用FactoryBean接口。public class UserFactoryBean implements FactoryBeanUser {Overridepublic User getObject() throws Exception {return new User();}Overridepublic Class? getObjectType() {return User.class;} } 在它的getObject方法中可以实现我们自己的逻辑创建对象并且在getObjectType方法中我们可以定义对象的类型。然后在bean.xml文件中配置bean时只需像普通的bean一样配置即可。bean iduserFactoryBean classcom.sue.async.service.UserFactoryBean /bean 轻松搞定so easy。注意getBean(userFactoryBean);获取的是getObject方法中返回的对象。而getBean(userFactoryBean);获取的才是真正的UserFactoryBean对象。我们通过上面五种方式在bean.xml文件中把bean配置好之后spring就会自动扫描和解析相应的标签并且帮我们创建和实例化bean然后放入spring容器中。虽说基于xml文件的方式配置bean简单而且非常灵活比较适合一些小项目。但如果遇到比较复杂的项目则需要配置大量的bean而且bean之间的关系错综复杂这样久而久之会导致xml文件迅速膨胀非常不利于bean的管理。2. Component注解为了解决bean太多时xml文件过大从而导致膨胀不好维护的问题。在spring2.5中开始支持Component、Repository、Service、Controller等注解定义bean。如果你有看过这些注解的源码的话就会惊奇得发现其实后三种注解也是Component。Component系列注解的出现给我们带来了极大的便利。我们不需要像以前那样在bean.xml文件中配置bean了现在只用在类上加Component、Repository、Service、Controller这四种注解中的任意一种就能轻松完成bean的定义。Service public class PersonService {public String get() {return data;} } 其实这四种注解在功能上没有特别的区别不过在业界有个不成文的约定Controller 一般用在控制层Service 一般用在业务层Repository 一般用在数据层Component 一般用在公共组件上太棒了简直一下子解放了我们的双手。不过需要特别注意的是通过这种Component扫描注解的方式定义bean的前提是需要先配置扫描路径。目前常用的配置扫描路径的方式如下在applicationContext.xml文件中使用context:component-scan标签。例如context:component-scan base-packagecom.sue.cache / 在springboot的启动类上加上ComponentScan注解例如ComponentScan(basePackages  com.sue.cache) SpringBootApplication public class Application {public static void main(String[] args) {new SpringApplicationBuilder(Application.class).web(WebApplicationType.SERVLET).run(args);} } 直接在SpringBootApplication注解上加它支持ComponentScan功能SpringBootApplication(scanBasePackages  com.sue.cache) public class Application {public static void main(String[] args) {new SpringApplicationBuilder(Application.class).web(WebApplicationType.SERVLET).run(args);} } 当然如果你需要扫描的类跟springboot的入口类在同一级或者子级的包下面无需指定scanBasePackages参数spring默认会从入口类的同一级或者子级的包去找。SpringBootApplication public class Application {public static void main(String[] args) {new SpringApplicationBuilder(Application.class).web(WebApplicationType.SERVLET).run(args);} } 此外除了上述四种Component注解之外springboot还增加了RestController注解它是一种特殊的Controller注解所以也是Component注解。RestController还支持ResponseBody注解的功能即将接口响应数据的格式自动转换成json。Component系列注解已经让我们爱不释手了它目前是我们日常工作中最多的定义bean的方式。3. JavaConfigComponent系列注解虽说使用起来非常方便但是bean的创建过程完全交给spring容器来完成我们没办法自己控制。spring从3.0以后开始支持JavaConfig的方式定义bean。它可以看做spring的配置文件但并非真正的配置文件我们需要通过编码java代码的方式创建bean。例如Configuration public class MyConfiguration {Beanpublic Person person() {return new Person();} } 在JavaConfig类上加Configuration注解相当于配置了beans标签。而在方法上加Bean注解相当于配置了bean标签。此外springboot还引入了一些列的Conditional注解用来控制bean的创建。Configuration public class MyConfiguration {ConditionalOnClass(Country.class)Beanpublic Person person() {return new Person();} } ConditionalOnClass注解的功能是当项目中存在Country类时才实例化Person类。换句话说就是如果项目中不存在Country类就不实例化Person类。这个功能非常有用相当于一个开关控制着Person类只有满足一定条件才能实例化。spring中使用比较多的Conditional还有ConditionalOnBeanConditionalOnPropertyConditionalOnMissingClassConditionalOnMissingBeanConditionalOnWebApplication如果你对这些功能比较感兴趣可以看看《spring中那些让你爱不释手的代码技巧续集》这是我之前写的一篇文章里面做了更详细的介绍。下面用一张图整体认识一下Conditional家族:nice有了这些功能我们终于可以告别麻烦的xml时代了。4. Import注解通过前面介绍的Configuration和Bean相结合的方式我们可以通过代码定义bean。但这种方式有一定的局限性它只能创建该类中定义的bean实例不能创建其他类的bean实例如果我们想创建其他类的bean实例该怎么办呢这时可以使用Import注解导入。4.1 普通类spring4.2之后Import注解可以实例化普通类的bean实例。例如先定义了Role类Data public class Role {private Long id;private String name; } 接下来使用Import注解导入Role类Import(Role.class) Configuration public class MyConfig { } 然后在调用的地方通过Autowired注解注入所需的bean。RequestMapping(/) RestController public class TestController {Autowiredprivate Role role;GetMapping(/test)public String test() {System.out.println(role);return test;} } 聪明的你可能会发现我没有在任何地方定义过Role的bean但spring却能自动创建该类的bean实例这是为什么呢这也许正是Import注解的强大之处。此时有些朋友可能会问Import注解能定义单个类的bean但如果有多个类需要定义bean该怎么办呢恭喜你这是个好问题因为Import注解也支持。Import({Role.class, User.class}) Configuration public class MyConfig { } 甚至如果你想偷懒不想写这种MyConfig类springboot也欢迎。Import({Role.class, User.class}) SpringBootApplication(exclude  {DataSourceAutoConfiguration.class,DataSourceTransactionManagerAutoConfiguration.class}) public class Application {public static void main(String[] args) {new SpringApplicationBuilder(Application.class).web(WebApplicationType.SERVLET).run(args);} } 可以将Import加到springboot的启动类上。这样也能生效springboot的启动类一般都会加SpringBootApplication注解该注解上加了SpringBootConfiguration注解。而SpringBootConfiguration注解上面又加了Configuration注解所以springboot启动类本身带有Configuration注解的功能。意不意外惊不惊喜4.2 Configuration类上面介绍了Import注解导入普通类的方法它同时也支持导入Configuration类。先定义一个Configuration类Configuration public class MyConfig2 {Beanpublic User user() {return  new User();}Beanpublic Role role() {return new Role();} } 然后在另外一个Configuration类中引入前面的Configuration类Import({MyConfig2.class}) Configuration public class MyConfig { } 这种方式如果MyConfig2类已经在spring指定的扫描目录或者子目录下则MyConfig类会显得有点多余。因为MyConfig2类本身就是一个配置类它里面就能定义bean。但如果MyConfig2类不在指定的spring扫描目录或者子目录下则通过MyConfig类的导入功能也能把MyConfig2类识别成配置类。这就有点厉害了喔。其实下面还有更高端的玩法。swagger作为一个优秀的文档生成框架在spring项目中越来越受欢迎。接下来我们以swagger2为例介绍一下它是如何导入相关类的。众所周知我们引入swagger相关jar包之后只需要在springboot的启动类上加上EnableSwagger2注解就能开启swagger的功能。其中EnableSwagger2注解中导入了Swagger2DocumentationConfiguration类。该类是一个Configuration类它又导入了另外两个类SpringfoxWebMvcConfigurationSwaggerCommonConfigurationSpringfoxWebMvcConfiguration类又会导入新的Configuration类并且通过ComponentScan注解扫描了一些其他的路径。SwaggerCommonConfiguration同样也通过ComponentScan注解扫描了一些额外的路径。如此一来我们通过一个简单的EnableSwagger2注解就能轻松的导入swagger所需的一系列bean并且拥有swagger的功能。还有什么好说的狂起点赞简直完美。4.3 ImportSelector上面提到的Configuration类它的功能非常强大。但怎么说呢它不太适合加复杂的判断条件根据某些条件定义这些bean根据另外的条件定义那些bean。那么这种需求该怎么实现呢这时就可以使用ImportSelector接口了。首先定义一个类实现ImportSelector接口public class DataImportSelector implements ImportSelector {Overridepublic String[] selectImports(AnnotationMetadata importingClassMetadata) {return new String[]{com.sue.async.service.User, com.sue.async.service.Role};} } 重写selectImports方法在该方法中指定需要定义bean的类名注意要包含完整路径而非相对路径。然后在MyConfig类上Import导入这个类即可Import({DataImportSelector.class}) Configuration public class MyConfig { } 朋友们是不是又发现了一个新大陆不过这个注解还有更牛逼的用途。EnableAutoConfiguration注解中导入了AutoConfigurationImportSelector类并且里面包含系统参数名称spring.boot.enableautoconfiguration。AutoConfigurationImportSelector类实现了ImportSelector接口。并且重写了selectImports方法该方法会根据某些注解去找所有需要创建bean的类名然后返回这些类名。其中在查找这些类名之前先调用isEnabled方法判断是否需要继续查找。该方法会根据ENABLED_OVERRIDE_PROPERTY的值来作为判断条件。而这个值就是spring.boot.enableautoconfiguration。换句话说这里能根据系统参数控制bean是否需要被实例化优秀。我个人认为实现ImportSelector接口的好处主要有以下两点把某个功能的相关类可以放到一起方面管理和维护。重写selectImports方法时能够根据条件判断某些类是否需要被实例化或者某个条件实例化这些bean其他的条件实例化那些bean等。我们能够非常灵活的定制化bean的实例化。4.4 ImportBeanDefinitionRegistrar我们通过上面的这种方式确实能够非常灵活的自定义bean。但它的自定义能力还是有限的它没法自定义bean的名称和作用域等属性。有需求就有解决方案。接下来我们一起看看ImportBeanDefinitionRegistrar接口的神奇之处。先定义CustomImportSelector类实现ImportBeanDefinitionRegistrar接口public class CustomImportSelector implements ImportBeanDefinitionRegistrar {Overridepublic void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {RootBeanDefinition roleBeanDefinition  new RootBeanDefinition(Role.class);registry.registerBeanDefinition(role, roleBeanDefinition);RootBeanDefinition userBeanDefinition  new RootBeanDefinition(User.class);userBeanDefinition.setScope(ConfigurableBeanFactory.SCOPE_PROTOTYPE);registry.registerBeanDefinition(user, userBeanDefinition);} } 重写registerBeanDefinitions方法在该方法中我们可以获取BeanDefinitionRegistry对象通过它去注册bean。不过在注册bean之前我们先要创建BeanDefinition对象它里面可以自定义bean的名称、作用域等很多参数。然后在MyConfig类上导入上面的类Import({CustomImportSelector.class}) Configuration public class MyConfig { } 我们所熟悉的fegin功能就是使用ImportBeanDefinitionRegistrar接口实现的具体细节就不多说了有兴趣的朋友可以加我微信找我私聊。5. PostProcessor除此之外spring还提供了专门注册bean的接口BeanDefinitionRegistryPostProcessor。该接口的方法postProcessBeanDefinitionRegistry上有这样一段描述修改应用程序上下文的内部bean定义注册表标准初始化。所有常规bean定义都将被加载但是还没有bean被实例化。这允许进一步添加在下一个后处理阶段开始之前定义bean。如果用这个接口来定义bean我们要做的事情就变得非常简单了。只需定义一个类实现BeanDefinitionRegistryPostProcessor接口。Component public class MyRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {Overridepublic void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {RootBeanDefinition roleBeanDefinition  new RootBeanDefinition(Role.class);registry.registerBeanDefinition(role, roleBeanDefinition);RootBeanDefinition userBeanDefinition  new RootBeanDefinition(User.class);userBeanDefinition.setScope(ConfigurableBeanFactory.SCOPE_PROTOTYPE);registry.registerBeanDefinition(user, userBeanDefinition);}Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {} } 重写postProcessBeanDefinitionRegistry方法在该方法中能够获取BeanDefinitionRegistry对象它负责bean的注册工作。不过细心的朋友可能会发现里面还多了一个postProcessBeanFactory方法没有做任何实现。这个方法其实是它的父接口BeanFactoryPostProcessor里的方法。在应用程序上下文的标准bean工厂之后修改其内部bean工厂初始化。所有bean定义都已加载但没有bean将被实例化。这允许重写或添加属性甚至可以初始化bean。Component public class MyPostProcessor implements BeanFactoryPostProcessor {Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {DefaultListableBeanFactory registry  (DefaultListableBeanFactory)beanFactory;RootBeanDefinition roleBeanDefinition  new RootBeanDefinition(Role.class);registry.registerBeanDefinition(role, roleBeanDefinition);RootBeanDefinition userBeanDefinition  new RootBeanDefinition(User.class);userBeanDefinition.setScope(ConfigurableBeanFactory.SCOPE_PROTOTYPE);registry.registerBeanDefinition(user, userBeanDefinition);} } 既然这两个接口都能注册bean那么他们有什么区别BeanDefinitionRegistryPostProcessor 更侧重于bean的注册BeanFactoryPostProcessor 更侧重于对已经注册的bean的属性进行修改虽然也可以注册bean。此时有些朋友可能会问既然拿到BeanDefinitionRegistry对象就能注册bean那通过BeanFactoryAware的方式是不是也能注册bean呢从下面这张图能够看出DefaultListableBeanFactory就实现了BeanDefinitionRegistry接口。这样一来我们如果能够获取DefaultListableBeanFactory对象的实例然后调用它的注册方法不就可以注册bean了说时迟那时快定义一个类实现BeanFactoryAware接口Component public class BeanFactoryRegistry implements BeanFactoryAware {Overridepublic void setBeanFactory(BeanFactory beanFactory) throws BeansException {DefaultListableBeanFactory registry  (DefaultListableBeanFactory) beanFactory;RootBeanDefinition rootBeanDefinition  new RootBeanDefinition(User.class);registry.registerBeanDefinition(user, rootBeanDefinition);RootBeanDefinition userBeanDefinition  new RootBeanDefinition(User.class);userBeanDefinition.setScope(ConfigurableBeanFactory.SCOPE_PROTOTYPE);registry.registerBeanDefinition(user, userBeanDefinition);} } 重写setBeanFactory方法在该方法中能够获取BeanFactory对象它能够强制转换成DefaultListableBeanFactory对象然后通过该对象的实例注册bean。当你满怀喜悦的运行项目时发现竟然报错了为什么会报错spring中bean的创建过程顺序大致如下BeanFactoryAware接口是在bean创建成功并且完成依赖注入之后在真正初始化之前才被调用的。在这个时候去注册bean意义不大因为这个接口是给我们获取bean的并不建议去注册bean会引发很多问题。此外ApplicationContextRegistry和ApplicationListener接口也有类似的问题我们可以用他们获取bean但不建议用它们注册bean。 往期推荐 Autowired报错的4种解决方案和原因分析SpringBoot 中的 3 种条件装配SpringBoot 过滤器、拦截器、监听器对比及使用场景
http://wiki.neutronadmin.com/news/119390/

相关文章:

  • 聊城网站开发培训微网站 模板
  • 有偷菜餐厅城市建设的网站网站建设服务流程
  • 佛山市建设企业网站服务机构wordpress添加留言
  • 网站登录验证码显示不出来温州品牌推广
  • 在线代理浏览器网站免费网站app哪个最好
  • 协会网站建设计划东莞微信网站
  • 织梦可以放两个网站网站建设的流程简答题
  • 做kegg通路富集的网站vue做的pc线上网站
  • 购物帮做特惠的导购网站在线logo免费设计生成器标智客
  • 广州网站建设粤icpit外包合同模板
  • 怎么在网站后台做图片新闻西宁城西区建设局网站
  • 建设网站需要的工具山东省建设人才网站
  • 高度重视局门户网站建设网站提交做外链有什么作用
  • 网站建设如何描述策划书模板
  • 网站建设深圳哪家好免费发外链平台
  • 网站的建设域名空间网站开发详细设计文档模板
  • 预约网站制作教育网站
  • 厦门市建设局网站公布网站开发的就业前景如何
  • 图片站wordpress模板下载南通网站建设制作公司
  • 永城网站设计公司做图片带字的网站
  • 网站介绍怎么写范文seo顾问服务公司站长
  • 怎么做网站排版网站题头是什么
  • 茂名网站开发公司做网站 公司
  • 香奈儿网站建设目标大连哪个公司做网站好
  • 简单建站外贸网站建设是什么
  • 家政的网站怎么做怎么创建属于自己的平台
  • 大理高端网站建设免费企业网站系统源码
  • 网站开发及推广是怎么回事网站开发管理学什么
  • 中国城镇建设网站软文网站备案如何查询
  • 网站的设计步骤十个有创意的线上活动