欲高屋建瓴,方得始终
文章目录
一:Maven搭建Spring
(1)构建工程
(2)导入Spring依赖包
然后将下面Spring依赖包加入pom圆圈中的位置
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.2.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.2.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>5.2.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>5.2.7.RELEASE</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
刷新一下maven后将会下载依赖包,这样Spring最简单的基本框架已经搭建好了
(3)构建resource包
随后我们观察一下包结构,发现会没有resource包(用来放xml文件),我们可以自己在main包下新建一个名字为resource的包
随后鼠标右键将这个包构建为源码包
(4)新建SpringXML文件
在resource包鼠标右键
二:XML创建Bean实例及赋初值
原理: 通过xml文件创建bean,也就是创建对象实例,当我们需要使用时不再通过new的方式创建一个实例,而是通过从Spring的容器中拿到该对象的实例,这就体现了“控制反转”这一特性:将创建对象的权力从程序(由new方式创建)交给了Spring框架,由xml文件控制生成,当使用时,从容器中取便是; 而这一流程可分为3个步骤:
- 新建java类
- 在xml文件中配置类的信息
- 加载xml文件,然后取得对象
所以最关键的几段代码如下:
(1)加载xml,通过它获得bean,等一系列操作:ApplicationContext applicationContext=new ClassPathXmlApplicationContext(“applicationContext.xml”);
(2)写xml文件,配置bean:class是类所在路径,id是下文将要引用时使用的:< bean id=“UserDao” class=“com.learn.UserDao”>< /bean>
(3)取得对象: applicationContext.getBean(“UserDao”);
(1)创建bean
首先创建一个简单的类
public class UserDao {
void findUser(){
System.out.println("UserDao->findUser");
}
}
xml写入这个类
<bean id="UserDao" class="com.learn.UserDao"></bean>
在主类中通过Spring容器取得对象
public class App
{
public static void main( String[] args )
{
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao= (UserDao) applicationContext.getBean("UserDao");
userDao.findUser();
}
}
从打印的结果来看,成功创建并取得对象并执行了方法
(2)赋予初值
在这一块体现的是Spring的依赖注入的特性
方式一:
(1)新建java类,必须要带有getter,setter方法
public class Person {
private int age;
private String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Person(int age, String name) {
this.age = age;
this.name = name;
}
public String getName() {
return name;
}
@Override
public String toString() {
return "Person{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
public void setName(String name) {
this.name = name;
}
}
(2)在xml文件中使用 < property name=“age” value=“20” >< /property>配置初始值,主要name要与类中的字段保持一致。
<bean id="Person" class="com.learn.Person">
<property name="age" value="20" ></property>
<property name="name" value="张三" ></property>
</bean>
(3)在主类中打印一下,看看能不能获得初始值
public class App
{
public static void main( String[] args )
{
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
Person person= (Person) applicationContext.getBean("Person");
System.out.println(person.getAge());
System.out.println(person.getName());
}
}
结果显示有了初始值:
方式二:
与方式一不同的是:在xml配置文件中,不是使用property了,而是下面这种:
<bean id="Person" class="com.learn.Person">
<!-- <property name="age" value="20" ></property>-->
<!-- <property name="name" value="张三" ></property>-->
<constructor-arg index="0" value="20" />
<constructor-arg index="1" value="ZhangSan" />
</bean>
效果也是一样的:
方式三:
使用时要注意对Spring的版本有要求,而且现在还不是特别常用
(3)给数组赋予初值
(1)新建java类
import java.util.Arrays;
import java.util.List;
public class Student {
private String[] ids;
@Override
public String toString() {
return "Student{" +
"ids=" + Arrays.toString(ids) +
", stringList=" + stringList +
'}';
}
public List<String> getStringList() {
return stringList;
}
public void setStringList(List<String> stringList) {
this.stringList = stringList;
}
private List<String> stringList;
public String[] getIds() {
return ids;
}
public void setIds(String[] ids) {
this.ids = ids;
}
}
(2)配置xml文件,赋予初始值
<bean class="comlearn.Student" id="student">
<property name="ids">
<array>
<value>0001</value>
<value>0002</value>
<value>0003</value>
<value>0004</value>
</array>
</property>
<property name="stringList">
<array>
<value>0005</value>
<value>0006</value>
<value>0007</value>
<value>0008</value>
</array>
</property>
</bean>
(4)主类进行测试
public class App
{
public static void main( String[] args )
{
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
Student student= (Student) applicationContext.getBean("student");
System.out.println(student);
}
}
(4)给map赋予初值
import java.util.Map;
public class TestMap {
private Map<Integer, String>map;
@Override
public String toString() {
return "TestMap{" +
"map=" + map +
'}';
}
public Map<Integer, String> getMap() {
return map;
}
public void setMap(Map<Integer, String> map) {
this.map = map;
}
}
<bean class="com.learn.TestMap" id="map">
<property name="map">
<map>
<entry>
<key>
<value>1</value>
</key>
<value>ZhangSan</value>
</entry>
<entry>
<key>
<value>2</value>
</key>
<value>ZhangSan2</value>
</entry>
</map>
</property>
</bean>
public class App
{
public static void main( String[] args )
{
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
TestMap map= (TestMap) applicationContext.getBean("map");
System.out.println(map);
}
}
三:如何从三层架构中使用
当另外一个类是一个类的成员变量时,如何通过xml获得对象实例 ?,比如有个UserDao,现在按照三层架构的写法,需要一个service来实现一些操作,那么该怎么做?那我们要在这个类中getter,setter这个类,然后在通过xml文件配置它,其代码如下:
新建一个类:
public class UserService {
private UserDao userDao;
public UserDao getUserDao() {
return userDao;
}
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void findUser(){
System.out.println("------------------service->");
userDao.findUser();
}
}
xml代码:
<bean id="UserDao" class="com.learn.UserDao"></bean>
<bean class="com.learn.UserService" id="userService">
<property name="userDao" ref="UserDao"></property>
</bean>
在主类中实验看可不可以调用UserDao的方法:
public class App
{
public static void main( String[] args )
{
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService= (UserService) applicationContext.getBean("userService");
userService.findUser();
}
}
在以上代码中,UserDao是其中的变量 ,通过xml配置它,然后利用UserService中的setter和getter方法,实现获得UserDao的实例,这个特性利用的就是注解
最后给大家看看xml全部代码及包结构
四: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="UserDao" class="com.learn.UserDao"></bean>
<bean id="Person" class="com.learn.Person">
<!-- <property name="age" value="20" ></property>-->
<!-- <property name="name" value="张三" ></property>-->
<constructor-arg index="0" value="20" />
<constructor-arg index="1" value="ZhangSan" />
</bean>
<bean class="com.learn.Student" id="student">
<property name="ids">
<array>
<value>0001</value>
<value>0002</value>
<value>0003</value>
<value>0004</value>
</array>
</property>
<property name="stringList">
<array>
<value>0005</value>
<value>0006</value>
<value>0007</value>
<value>0008</value>
</array>
</property>
</bean>
<bean class="com.learn.TestMap" id="map">
<property name="map">
<map>
<entry>
<key>
<value>1</value>
</key>
<value>ZhangSan</value>
</entry>
<entry>
<key>
<value>2</value>
</key>
<value>ZhangSan2</value>
</entry>
</map>
</property>
</bean>
<bean class="com.learn.UserService" id="userService">
<property name="userDao" ref="UserDao"></property>
</bean>
</beans>