GVKun编程网logo

如何使用注解而不是XML定义Spring bean?(spring使用注解代替xml)

11

想了解如何使用注解而不是XML定义Springbean?的新动态吗?本文将为您提供详细的信息,我们还将为您解答关于spring使用注解代替xml的相关问题,此外,我们还将为您介绍关于(D)spring

想了解如何使用注解而不是XML定义Spring bean?的新动态吗?本文将为您提供详细的信息,我们还将为您解答关于spring使用注解代替xml的相关问题,此外,我们还将为您介绍关于(D)spring boot使用注解类代替xml配置实例化bean、c# – 如何使用CR生成XML,而不是XmlTextWriter中的CRLF、java main 程序如何使用注解注入spring管理的bean、Java Spring Beans.xml里的Bean定义是如何被解析出来的的新知识。

本文目录一览:

如何使用注解而不是XML定义Spring bean?(spring使用注解代替xml)

如何使用注解而不是XML定义Spring bean?(spring使用注解代替xml)

我已经在xml配置文件中定义了:

<bean id="bootstrap"></bean>

这很好。

bootsrap类:

public class Bootstrap {   @PostConstruct   public void onServerStart() {      System.out.println("PRINTSSSSSSSSSSSSSSSSSSS");   }}

该方法被触发。

但是,我如何摆脱xml部分,而将引导程序注释为bean?

我有

<mvc:annotation-driven /><context:annotation-config />

<context:component-scan base-package="com.package" />

但是我 想知道 应该使用 什么注释 来代替:

<bean id="bootstrap"></bean>

我在网上和spring文档中都找不到关于此的任何信息:(

答案1

小编典典

有关于此的文档。您将需要类似的构造型注释@Component

构造型bean注释

(D)spring boot使用注解类代替xml配置实例化bean

(D)spring boot使用注解类代替xml配置实例化bean

bean经常需要被实例化,最常见的就是new一个呗,Bean bean = new Bean(),方便好用还快捷。

然而在我们刚开始学习写i项目的时候却发现,new不好用哦,并且也不报错,根本不知道怎么找原因

比如

package com.example;

import org.springframework.boot.Banner;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import com.example.bean.Book;
import com.example.demo.test.TestConfiguration;




@SpringBootApplication
public class Application{

    public static void main(String[] args) {
        
          SpringApplicationBuilder builder = new SpringApplicationBuilder(Application.class);
            //修改Banner的模式为OFF,启动时控制台将不打印显示字符wow
            builder.bannerMode(Banner.Mode.OFF).run(args);

            Book bookconfig = new Book();
            System.out.println( "emmmm..... The BookName is "
                                                                +bookconfig.getName()
                                                                +";and Book Author is "
                                                                +bookconfig.getAuthor()
                                                                +";and Book price is "
                                                                +bookconfig.getPrice());
            
        //SpringApplication.run(Application.class, args);//默认启动方式
    }


}

控制台打印的却是

 

 打印出来是null,可见实例化了一个bookconfig,却并没有从属性文件中读到属性值。

按照spring boot简化配置的思路以及spring的尿性,启动注解大法吧!

首先在Book类上@Scope("singleton"),表明这是一个单例类,容器中只有一个该类的实例,然后准备一个配置类

package com.example.demo.test;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
//配置类,用来取代spring.xml那一堆<beans></beans>头文件
@Configuration
@ComponentScan(value="com.example")
public class TestConfiguration {
    public TestConfiguration() {
        System.out.println("Configuration容器启动初始化。。。");
    }
}

这个配置类的作用注释中也都写了,就是我们常见的spring.xml里面的那一堆头文件 <beans></beans>节点间的内容。

嗯,意思就是写了这个清爽的配置类就不用在spring.xml里面配置各种bean了。@Configuration  @ComponentScan(value="com.example")这两个注解的作用就要自己看了。推荐

https://blog.csdn.net/u012702547/article/details/53633872

然而真的不需要spring.xml了吗?naive!少不了的不要想了。

怎么使用这个配置类呢?

package com.example;

import org.springframework.boot.Banner;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import com.example.bean.Book;
import com.example.demo.test.TestConfiguration;




@SpringBootApplication
public class Application{

    public static void main(String[] args) {
        
          SpringApplicationBuilder builder = new SpringApplicationBuilder(Application.class);
            //修改Banner的模式为OFF,启动时控制台将不打印显示字符wow
            builder.bannerMode(Banner.Mode.OFF).run(args);
            @SuppressWarnings("resource")
            ApplicationContext context = new AnnotationConfigApplicationContext(TestConfiguration.class);

            Book bookconfig = context.getBean(Book.class);
            Book bookconfig2 =  context.getBean(Book.class);
      
            System.out.println( "测试@Scope注解的类的设计模式"+bookconfig.equals(bookconfig2));
            System.out.println( "emmmm..... The BookName is "
                                                                +bookconfig.getName()
                                                                +";and Book Author is "
                                                                +bookconfig.getAuthor()
                                                                +";and Book price is "
                                                                +bookconfig.getPrice());
            
        //SpringApplication.run(Application.class, args);//默认启动方式
    }


}

哈哈哈哈,是的,如你所见,new一下这个配置类就好了。

然后直接把需要的类拿来用。

嗯,这样看起来是不需要每次手动去new一个,然而,并没有节约代码量啊衰。。。。。

 

 ABCD四篇合集项目地址:https://github.com/tuliptulpen/studyspringboot

 

 

 

c# – 如何使用CR生成XML,而不是XmlTextWriter中的CRLF

c# – 如何使用CR生成XML,而不是XmlTextWriter中的CRLF

我正在通过XmlTextWriter生成 XML.

该文件看起来很好,验证(at wc3),并被客户接受.

但客户端供应商抱怨线路终端是CRLF,而不仅仅是CR.

好吧,我在使用C#的Win32机器上,而CRLF是Win32标准的行结束.
有没有办法改变XmlTextWriter中的行结尾?

另外 – 对于正确的XML解析器,行结尾不应该无关紧要吗?

另见:What are carriage return,linefeed,and form feed?

注意:看起来唯一的答案是横向解决方案 – 您必须使用XmlWriter而不是XmlTextWriter

解决方法

当然,在询问后的那一刻,我发现MSDN上的线索(我通过谷歌找不到)指的是 XmlWriterSettings.NewLineChars

然后在SO: Writing XMLDocument to file with specific newline character (c#)引导我接受了不可接受的答案

一切都在术语…..

java main 程序如何使用注解注入spring管理的bean

java main 程序如何使用注解注入spring管理的bean

在论坛里面逛了一圈发现很多人在main方法里面注入bean都是使用,

ApplicationContext applicationContext = new ClassPathXmlApplicationContext("***");

applicationContext.getBean()

的方式从spring容器中拿到需要的实例,可是为什么不能使用注解的方式拿到需要的实例呢?于是我做了一系列尝试,首先你需要让该main方法在spring的扫描范围内,即

<context:component-scan base-package="**"/>

需要包含main程序,因为@Autowired必须注释在一个类中的全局变量上,所以加载配置文件必须再那个方法加载进虚拟机的时候就应该给他实例化,所以

static ApplicationContext applicationContext = new ClassPathXmlApplicationContext("***");

我把那个方法拿出来成为成员变量还给它加了static,但是我发现及时这样spring还是不会给我的类注入所需要的bean,具体的代码如下:

public class FundsProcessor {

    private static final Logger logger = Logger.getLogger(FundsProcessor.class);

    private static ApplicationContext applicationContext = new ClassPathXmlApplicationContext("***");
    
    @Autowired
    private JedisManager jedisManager;
    
    public static void main(String[] args) {

        logger.info("funds processor start...");

而且我试了一下好像spring根本没有去扫描我这个类,但是确实已经在<context:component-scan base-package="**"/> 中包含了该类了

Java Spring Beans.xml里的Bean定义是如何被解析出来的

Java Spring Beans.xml里的Bean定义是如何被解析出来的

ClassPathXmlApplicationContext的构造函数里,一部分逻辑是给各个成员变量赋上初始值:

然后是执行refresh操作。

获取ConfigurableListableBeanFactory:

来自Beans.xml的bean,被解析出来后,就存储在BeanFactory的成员变量beanDefinitionMap里。

那么Beans.xml里的bean定义,是如何被解析的呢?

进入abstractApplicationContext里看个究竟:

loadBeanDefintions方法:

进入AbstractXmlApplicationContext的loadBeanDefinitions方法:

从Beans.xml处读取并解析bean定义:reader.loadBeanDefinitions(configLocations);

递归调用方法AbstractBeanDefinitionReader的loadBeanDefinitions:


递归调用loadBeanDefinitions,此时这个方法接收的输入参数成为了Resource类型:

进入了XmlBeanDefinitionReader.loadBeanDefinitions方法:

开始对Beans.xml文件进行IO操作:

将Java IO操作返回的inputSource传入doLoadDocument:

使用documentBuilder解析Beans.xml:

countBefore为0,然后进行registerBeanDefinitions操作:

在registerBeanDefintions方法里,通过org.w3c.dom.Element提供的XML API进行解析:

解析分为preProcess,parseBeanDefinitions和postProcess三个步骤:

进入这个IF分支,说明在Beans.xml里找到了一个bean节点:

这就是解析出来的beanDefinition:

在Beans.xml里的bean定义如下:

要获取更多Jerry的原创文章,请关注公众号"汪子熙":

本文分享 CSDN - 汪子熙。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

我们今天的关于如何使用注解而不是XML定义Spring bean?spring使用注解代替xml的分享就到这里,谢谢您的阅读,如果想了解更多关于(D)spring boot使用注解类代替xml配置实例化bean、c# – 如何使用CR生成XML,而不是XmlTextWriter中的CRLF、java main 程序如何使用注解注入spring管理的bean、Java Spring Beans.xml里的Bean定义是如何被解析出来的的相关信息,可以在本站进行搜索。

本文标签: