Spring 4学习——问题与注意事项(一)
1.Spring项目依赖的jar包有5个:
2.applicationContext.xml文件中,如下bean的property的name值对应的是HelloWorld类中的setter方法,即name对应的是getName(),如果setter方法写为setName1,则name应该写为name="name1"。
<bean id = "helloWorld" class="com.swl.spring.beans.HelloWorld"> <property name="name" value="long"></property> </bean>
public class HelloWorld { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public void hello(){ System.out.println("hello "+name); } }
3.如果按照第11行的方式加载applicationContext.xml文件时,应该把applicationContext.xml文件放在文件夹src下,与包同一级别,而非包中,见图。
package com.swl.spring.beans; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Main { public static void main(String[] args){ //这两步由Spring完成 // HelloWorld helloWorld = new HelloWorld(); // helloWorld.setName("song "); //加载applicationContext.xml文件,创建ApplicaitonContext,从中取出bean ApplicationContext ctx = HelloWorld helloWorld = (HelloWorld) ctx.getBean("hello"); helloWorld.hello(); } }
如果像下图这样将applicationContext.xml文件放在包中,语句
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
会报错
六月 11, 2017 8:59:46 下午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh 信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@4d405ef7: startup date [Sun Jun 11 20:59:46 CST 2017]; root of context hierarchy 六月 11, 2017 8:59:46 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions 信息: Loading XML bean definitions from class path resource [applicationContext.xml] Exception in thread "main" org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from class path resource [applicationContext.xml]; nested exception is java.io.FileNotFoundException: class path resource [applicationContext.xml] cannot be opened because it does not exist at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:344) at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:304) at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:181) at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:217) at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:188) at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:252) at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:127) at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:93) at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:129) at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:614) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:515) at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139) at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83) at com.swl.spring.beans.Main.main(Main.java:11) Caused by: java.io.FileNotFoundException: class path resource [applicationContext.xml] cannot be opened because it does not exist at org.springframework.core.io.ClassPathResource.getInputStream(ClassPathResource.java:172) at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:330) ... 13 more
4.我们观察下面代码11行做了什么工作
//Main类 1 package com.swl.spring.beans; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Main { public static void main(String[] args){ // HelloWorld helloWorld = new HelloWorld(); // helloWorld.setName("song "); //创建Spring IOC容器对象 ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); // HelloWorld helloWorld = (HelloWorld) ctx.getBean("hello"); // helloWorld.hello(); } }
//HelloWorld类 1 package com.swl.spring.beans; public class HelloWorld { private String name; public HelloWorld() { System.out.println("HelloWorld Constructor"); } public String getName() { return name; } public void setName(String name) { System.out.println("HelloWorld setName"); this.name = name; } public void hello(){ System.out.println("hello "+name); } }
//applicationContext.xml文件<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id = "hello" class="com.swl.spring.beans.HelloWorld"> <property name="name" value="long"></property> </bean> </beans>
无参构造函数HelloWorld和setName()方法都输出标识语句,运行,在控制台可以看到如下输出
六月 11, 2017 9:14:30 下午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh 信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@4d405ef7: startup date [Sun Jun 11 21:14:30 CST 2017]; root of context hierarchy 六月 11, 2017 9:14:30 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions 信息: Loading XML bean definitions from class path resource [applicationContext.xml] HelloWorld Constructor HelloWorld setName
可以看到,语句
11 ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
执行,创建IOC容器对象过程中,会调用构造函数构造bean,并调用setName()方法为name属性赋值。
5.通过上面全类名的方式来配置Bean,用到了Java的反射机制,这就要求Bean必须要有一个无参的构造器;如果没有,会报错。
我们将HelloWorld的构造器改成有参数的,其余代码和4中相同:
public HelloWorld(String s) { System.out.println("HelloWorld Constructor"); }
运行,会报出如下错误:
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.swl.spring.beans.HelloWorld]: No default constructor found; nested exception is java.lang.NoSuchMethodException: com.swl.spring.beans.HelloWorld.<init>() at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:85) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1147) ... 13 more
6.也可以利用类型来获取IOC中的Bean,如下
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); // HelloWorld helloWorld = (HelloWorld) ctx.getBean("hello"); HelloWorld helloWorld = ctx.getBean(HelloWorld.class);
这种方式的缺点是在applicationContext.xml文件中配置两个类型相同的Bean时
<bean id = "hello" class="com.swl.spring.beans.HelloWorld"> <property name="name" value="long"></property> </bean> <bean id = "hello2" class="com.swl.spring.beans.HelloWorld"> <property name="name" value="long"></property> </bean>
虽然可以运行,但是报错
HelloWorld Constructor HelloWorld setName HelloWorld Constructor HelloWorld setName Exception in thread "main" org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'com.swl.spring.beans.HelloWorld' available: expected single matching bean but found 2: hello,hello2 at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1041) at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:345) at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:340) at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1090) at com.swl.spring.beans.Main.main(Main.java:13)
Spring 4学习——问题与注意事项(一)的更多相关文章
- Spring Boot学习笔记2——基本使用之最佳实践[z]
前言 在上一篇文章Spring Boot 学习笔记1——初体验之3分钟启动你的Web应用已经对Spring Boot的基本体系与基本使用进行了学习,本文主要目的是更加进一步的来说明对于Spring B ...
- Spring MVC 学习 -- 创建过程
Spring MVC 学习 -- 创建过程 Spring MVC我们使用的时候会在web.xml中配置 <servlet> <servlet-name>SpringMVC< ...
- 《Spring MVC学习指南》怎么样?答:书名具有很大的欺骗性
2016年6月21日 最近,因为工作需要,我从网上买了一本<Spring MVC学习指南>,ISBN编号: 978-7-115-38639-7,定价:49.00元.此书是[美]Paul D ...
- Spring框架学习一
Spring框架学习,转自http://blog.csdn.net/lishuangzhe7047/article/details/20740209 Spring框架学习(一) 1.什么是Spring ...
- Spring security 学习 (自助者,天助之!)
自己努力,何必要强颜欢笑的求助别人呢? 手心向下不求人! Spring security学习有进展哦: 哈哈! 1.页面都是动态生产的吧! 2.设置权限: a:pom.xml配置jar包 b:cr ...
- 转-Spring 注解学习手札(七) 补遗——@ResponseBody,@RequestBody,@PathVariable
转-http://snowolf.iteye.com/blog/1628861/ Spring 注解学习手札(七) 补遗——@ResponseBody,@RequestBody,@PathVariab ...
- 【转】Spring 注解学习手札(超好的springmvc注解教程)
Spring 注解学习手札(一) 构建简单Web应用 Spring 注解学习手札(二) 控制层梳理 Spring 注解学习手札(三) 表单页面处理 Spring 注解学习手札(四) 持久层浅析 Spr ...
- 【转】Spring.NET学习笔记——目录
目录 前言 Spring.NET学习笔记——前言 第一阶段:控制反转与依赖注入IoC&DI Spring.NET学习笔记1——控制反转(基础篇) Level 200 Spring.NET学习笔 ...
- Spring 注解学习手札(七) 补遗——@ResponseBody,@RequestBody,@PathVariable (转)
最近需要做些接口服务,服务协议定为JSON,为了整合在Spring中,一开始确实费了很大的劲,经朋友提醒才发现,SpringMVC已经强悍到如此地步,佩服! 相关参考: Spring 注解学习手札(一 ...
随机推荐
- HDU 5558 后缀数组+二分
题意有一些绕,但其实就是对于不断变化的i,求以j(0=j<i)使得suffix[j]与suffix[i]的最长公共前缀最长,如果有多个j,则取最小的j. 可以在rank数组中二分,在1-rank ...
- Jsoup抓取、解析网页和poi存取excel综合案例——采集网站的联系人信息
需求:采集网站中每一页的联系人信息 一.创建maven工程,添加jsoup和poi的依赖包 <!-- https://mvnrepository.com/artifact/org.apache. ...
- uoj#73 【WC2015】未来程序
在 2047 年,第 64 届全国青少年信息学奥林匹克冬令营前夕,B君找到了 2015 年,第 32 届冬令营的题目来练习. 他打开了第三题 “未来程序” 这道题目: 本题是一道提交答案题,一共 10 ...
- Fish Shell
今天看到阮一峰同学的一篇博客(Fish shell 入门教程),讲述的非常详细.清楚,有兴趣的可以直接转去查看此文,本文仅提供一下个人使用心得. 一.fish shell 想必接触过类unix(包括w ...
- .NET Core 2.0体验
.NET Core 2.0预览版及.NET Standard 2.0 Preview 这个月也就要发布了. 具体相关信息可以查看之前的文章.NET Core 2.0及.NET Standard 2.0 ...
- 高性能linux服务器内核调优
高性能linux服务器内核调优 首先,介绍一下两个命令1.dmesg 打印系统信息.有很多同学们服务器出现问题,看了程序日志,发现没啥有用信息,还是毫无解决头绪,这时候,你就需要查看系统内核抛出的异常 ...
- Hopfield神经网络实现污染字体的识别
这个网络的内部使用的是hebb学习规则 贴上两段代码: package geym.nn.hopfiled; import java.util.Arrays; import org.neuroph.co ...
- 使用java API操作hdfs--拷贝部分文件到hdfs
要求如下: 自行在本地文件系统生成一个大约一百多字节的文本文件,写一段程序(可以利用Java API或C API),读入这个文件,并将其第101-120字节的内容写入HDFS成为一个新文件. impo ...
- Java中处理二进制移位
我相信,这篇文章读起来会相当有趣. 文章中编程语言是Java,用Java的原因:第一,Java不做数据溢出校验,这样我们可以忽略溢出异常:第二,Java普及率比较高,就像是python或shell,几 ...
- 用ajax判断用户是否已存在?----2017-05-12
首先在用ajax之前,先说一下JSON: JSON:javascript object notation js对象标记 对于json,我们只需要知道如何定义json?如何输出?怎么遍历? 1.定义 ...