Spring系列 -(2)HelloWorld的基本构成
- 前言
- 1.pom.xml
- 2.Hello.java
- 3.bean.xml
- 4.测试类
- 总结
前言
上次演示了SpringIOC的基本用法,这次咱来一起探究一下SpringIOC中都有什么内容组成的
1.pom.xml
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
这个不用过多解释,就是导入Spring所需要的jar包
2.Hello.java
public class Hello {
private String name;
private String context;
public Hello() {
}
public Hello(String name, String context) {
this.name = name;
this.context = context;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getContext() {
return context;
}
public void setContext(String context) {
this.context = context;
}
@Override
public String toString() {
return "Hello{" +
"name='" + name + '\'' +
", context='" + context + '\'' +
'}';
}
}
这是一个普通的javaBean类,目的就是为了在创建对象时不通过直接new的方式而是通过IOC容器去获取
3.bean.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 https://www.springframework.org/schema/beans/spring-beans.xsd>
<context:component-scan base-package="java"></context:component-scan>
<bean id="hello" class="Hello">
<property name="name" value="adai"></property>
<property name="context" value="hello"></property>
</bean>
</beans>
这个是Spring的配置文件,补充一下昨天写欠的部分,要加上一句<context:component-scan base-package="java"></context:component-scan>
,Spring有两种实现方式,一种是基于注解实现,一种是基于xml配置文件实现,这个bean.xml就是Spring实现的配置文件
<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 https://www.springframework.org/schema/beans/spring-beans.xsd>
</beans>
这一段是导入命名空间,你xml里面用到了什么标签就要导入对应的命名空间
<context:component-scan base-package="java"></context:component-scan>
<bean id="hello" class="Hello">
<property name="name" value="adai"></property>
<property name="context" value="hello"></property>
</bean>
这一段是bean标签和context标签,context标签里有一个base-package,这是包扫描,意思就是你要扫描哪个包下的类,被扫描到的这些包下的类,在bean标签里面的class就可以只写类名不用写全称,比如下图,我想用java包下的那几个类,那么我可以写base-package="java"
这样,你在bean标签的class里面就不用加上java包。
接下来说说bean标签,bean标签比较复杂,里面可以传很多个值,这里先简单说下上面传的值,后续再跟大家说说别的值
<bean id="hello" class="Hello">
<property name="name" value="adai"></property>
<property name="context" value="hello"></property>
</bean>
首先,bean标签里有id和class两个值,class就是类名,当你要用IOC创建一个对象时,你就需要把要创建的对象的类名写给class,前提是你要有上面说的包扫描,就可以直接写类名,如果没有包扫描,那么就需要把全类名都写进去,id可以取任意,但一般都是把类名的首写字母改为小写作为id。然后可以看到bean标签里面还有两个property子标签,在文中,property传入了两个值,一个是name一个是value,name值就是你要赋给类里哪个属性的属性名,value就是属性的值,比如Hello里面有个name属性,那么就可以写name="name"
,前一个name是property的name值,后一个name是Hello类的name属性,value是adai。
4.测试类
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Mytest {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
Hello hello = `context.getBean("hello", Hello.class);`
String context1 = hello.getContext();
String name = hello.getName();
System.out.println(context1);
System.out.println(name);
}
}
最后说说测试类
ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
这一句是最关键的,new了这个ClassPathXmlApplicationContext类,并且传入bean.xml的参数,就可以取到一个类型为ApplicationContext的对象,这里用了多态更加的灵活,至此,bean.xml里的所有bean标签都已经被初始化了,就算后面没有用到,IOC也已经帮你初始化了,然后再通过调用context里的getBean方法并且传入刚才bean标签里面的id的值还有要创建的类.class,就可以获取到你刚才bean标签里面的属性的值,比如context.getBean("hello", Hello.class)
这里返回的类型就是Hello类型,并且这个hello对象里面的name和context属性就已经有我们刚才在bean标签里面所赋的value的值了
其实看到这里,很多人有疑问不是说不用new吗,这里不就有一个new创建对象吗,那不也一个样吗,确实,如果当你只创建一个类时确实看不出什么,但是当你有很多类要创建的时候,你就可以只创建一个ApplicationContext的对象,然后通过对象.getBean的方法获取对象。
总结
ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
这一步很重要,没有这一步就没办法加载bean,后面讲源码的时候也是从这一步切入的,bean标签里面也有很多学问,以后我会慢慢跟大家分享我所了解的Spring,学Spring有时候很枯燥,但是坚持下去会得到意想不到的收获的,一起加油