java面试题整理(19)

一、如何使用XML配置的方式配置Spring?

在Spring框架中,依赖和服务需要专门的配置文件中实现,一般用XML格式的配置文件。这些配置文件的格式采用公共的模板,由一系列的Bean定义和专门的应用配置选项组成。
Spring XML配置的主要目的是使所有的Spring组件都可以用XML文件的形式来进行配置。这意味着不会出现其他的Spring配置类型(比如声明的方式或基于Java Class的配置方式)。
Spring的XML配置方式是使用被Spring命名空间所支持的一系列的XML标签来实现的。Spring有以下主要的命名空间:context、beans、jdbc、tx、aop、mvc和aso。

<beans>
   <bean name="viewResolver"
        class="org.springframework.web.servlet.view.BeanNameViewResolver"/>
   <bean name="jsonTemplate"
        class="org.springframework.web.servlet.view.json.MappingJackson2JsonView"/>
   <bean id="restTemplate" class="org.springframework.web.client.RestTemplate"/>
</beans>

下面这个web.xml仅配置了DispatcherServlet,这最简单的配置便能满足应用程序配置运行时组件的需求。

<web-app>
   <display-name>Archetype Created Web Application</display-name>
   <servlet>
      <servlet-name>spring</servlet-name>
      <servlet-class>
         org.springframework.web.servlet.DispatcherServlet
      </servlet-class>
      <load-on-startup>1</load-on-startup>
   </servlet>
   <servlet-mapping>
      <servlet-name>spring</servlet-name>
      <url-pattern>/</url-pattern>
   </servlet-mapping>
</web-app>

二、Spring提供哪些配置形式?

Spring对Java配置的支持是由@Configuration注解和@Bean注解来实现的。由@Bean注解的方法将会实例化、配置和初始化一个新对象,这个对象将由Spring的IOC容器来管理。@Bean声明所起到的作用与元素类似。被@Configuration所注解的类则表示这个类的主要目的是作为Bean定义的资源。被@Configuration声明的类可以通过在同一个类的内部调用@bean方法来设置嵌入Bean的依赖关系。
最简单的@Configuration 声明类请参考下面的代码:

@Configuration
public class AppConfig{
   @Bean
   public MyService myService() {
      return new MyServiceImpl();
   }
}

与上面的@Beans配置文件相同的XML配置文件如下:

<beans>
   <bean id="myService" class="com.gupaoedu.services.MyServiceImpl"/>
</beans>

上述配置方式的实例化方式如下:

public static void main(String[] args) {
   ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
   MyService myService = ctx.getBean(MyService.class);
   myService.doStuff();
}

要使用组件扫描,仅需用@Configuration进行注解即可:

@Configuration
@ComponentScan(basePackages = "com.edu")
public class AppConfig  {
}

在上面的例子中,com.edu包首先会被扫描到,然后在容器内查找被@Component 声明的类,找到后将这些类按照Spring Bean定义进行注册。
如果你要在Web应用开发中选用上述配置方式,需要用AnnotationConfigWebApplicationContext类来读取配置文件,可以用来配置Spring的ContextLoaderListener或者Spring MVC的DispatcherServlet。

<web-app>
   <context-param>
      <param-name>contextClass</param-name>
      <param-value>
org.springframework.web.context.support.AnnotationConfigWebApplicationContext
      </param-value>
   </context-param>
   <context-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>com.edu.AppConfig</param-value>
   </context-param>
   <listener>
      <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
   </listener>
   <servlet>
      <servlet-name>dispatcher</servlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      <init-param>
         <param-name>contextClass</param-name>
         <param-value>
       org.springframework.web.context.support.AnnotationConfigWebApplicationContext
         </param-value>
      </init-param>
      <init-param>
         <param-name>contextConfigLocation</param-name>
         <param-value>com. edu.web.MVCConfig</param-value>
      </init-param>
   </servlet>
   <servlet-mapping>
      <servlet-name>dispatcher</servlet-name>
      <url-pattern>/web/*</url-pattern>
   </servlet-mapping>
</web-app>

三、怎样用注解的方式配置Spring?

Spring在2.5版本以后开始支持用注解的方式来配置依赖注入。可以用注解的方式来替代XML方式的Bean描述,可以将Bean描述转移到组件类的内部,只需要在相关类上、方法上或者字段声明上使用注解即可。注解注入将会被容器在XML注入之前处理,所以后者会覆盖前者对于同一个属性的处理结果。
注解装配在Spring中是默认关闭的,需要在Spring文件中配置一下才能使用基于注解的装配模式。如果你想要在应用程序中使用注解的方式,请参考如下配置:

<beans>
   <context:annotation-config/>
</beans>

标签配置完成以后,就可以用注解的方式在Spring中向属性、方法和构造方法中自动装配变量。
下面是几种比较重要的注解类型。
(1)@Required:该注解应用于设值方法。
(2)@Autowired:该注解应用于有值设值方法、非设值方法、构造方法和变量。
(3)@Qualifier:该注解和@Autowired注解搭配使用,用于消除特定Bean自动装配的歧义。
(4)JSR-250 Annotations:Spring支持基于JSR-250 注解的注解,@Resource、@PostConstruct 和 @PreDestroy。

四、请解释Spring Bean的生命周期?

Spring Bean的生命周期简单易懂。在一个Bean实例被初始化时,需要执行一系列初始化操作以达到可用的状态。同样,当一个Bean不再被调用时需要进行相关的析构操作,并从Bean容器中移除。
Spring Bean Factory 负责管理在Spring容器中被创建的Bean的生命周期。Bean的生命周期由两组回调方法组成。
(1)初始化之后调用的回调方法。
(2)销毁之前调用的回调方法。
Spring框架提供了以下四种方式来管理Bean的生命周期事件:
(1)InitializingBean和DisposableBean回调接口。
(2)针对特殊行为的其他Aware接口。
(3)Bean配置文件中的Custom init()方法和destroy()方法。
(4)@PostConstruct和@PreDestroy注解方式。
使用customInit()和 customDestroy()方法管理Bean生命周期的代码样例如下:

<beans>
   <bean id="demoBean" class="com.edu.task.DemoBean"
        init-Method="customInit" destroy-Method="customDestroy">
   </bean>
</beans>

五、Spring Bean作用域的区别是什么?

Spring容器中的Bean可以分为5个范围。所有范围的名称都是自说明的,但是为了避免混淆,还是来解释一下。
(1)singleton:这种Bean范围是默认的,这种范围确保不管接收到多少个请求,每个容器中只有一个Bean的实例,单例的模式由Bean Factory自身来维护。
(2)prototype:原形范围与单例范围相反,为每一个Bean请求提供一个实例。
(3)request:在请求Bean范围内为每一个来自客户端的网络请求创建一个实例,在请求完成以后,Bean会失效并被垃圾回收器回收。
(4)Session:与请求范围类似,确保每个Session中有一个Bean的实例,在Session过期后,Bean会随之失效。
(5)global-session:global-session和Portlet应用相关。当你的应用部署在Portlet容器中时,它包含很多portlet。如果你想要声明让所有的portlet共用全局的存储变量,那么这个全局变量需要存储在global-session中。全局作用域与Servlet中的Session作用域效果相同。

六、什么是Spring Inner Bean?

在Spring框架中,无论何时Bean被使用时,当仅被调用了一个属性,一个明智的做法是将这个Bean声明为内部Bean。内部Bean可以用setter注入“属性”和用构造方法注入“构造参数”的方式来实现。
比如,在我们的应用程序中,一个Customer类引用了一个Person类,我们要做的是创建一个Person的实例,然后在Customer内部使用。

public class Customer{
   private Person person;
}
public class Person{
   private String name;
   private String address;
   private int age;
}

内部Bean的声明方式如下:

<bean id="CustomerBean" class="com.edu.common.Customer">
   <property name="person">
      <bean class="com.edu.common.Person">
         <property name="name" value="kakaxi" />
         <property name="address" value="Japan" />
         <property name="age" value="34" />
      </bean>
   </property>
</bean>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值