一、使用Maven构建Java项目

* 项目目录结构

1、 在sun.service包下创建UserDao接口和接口实现类:

UserDao接口:

package sun.service;

/**
* @Classname UserService
* @Description TODO
* @Date 2020/9/15 14:51
* @Created by Administrator
*/
public interface UserService {
void saveUser();
}

UserDao接口

UserDao接口实现类:

package sun.service.ServiceImpl;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import sun.service.UserService; /**
* @Classname UserServiceImpl
* @Description TODO
* @Date 2020/9/15 14:52
* @Created by Administrator
*/
public class UserServiceImpl implements UserService {
public void saveUser() {
System.out.println("service saveUser方法执行了...");
}
}

2、在sun.web包下创建UserWeb类模拟Servlet:

UserWeb类:

package sun.web;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import sun.service.ServiceImpl.UserServiceImpl;
import sun.service.UserService; /**
* @Classname UserWeb
* @Description TODO
* @Date 2020/9/15 14:54
* @Created by Administrator
*/
public class UserWeb {
public static void main(String[] args) {
// 1 获取核心容器对象
ApplicationContext ac=new ClassPathXmlApplicationContext("bean.xml");
// 2 根据id获取bean对象
UserService userService = ac.getBean("userService", UserService.class);
userService.saveUser();
}
}
在main方法中通过 ApplicationContext ac=new ClassPathXmlApplicationContext("bean.xml") 读取bean.xml配置文件获取Spring核心容器对象。
再通过 UserService userService = ac.getBean("userService", UserService.class) 根据传入的id字符串获取该id对应的class类的对象。

3、在resource目录下创建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
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="userService" class="sun.service.ServiceImpl.UserServiceImpl"></bean>
</beans>

4、在pom.xml配置文件中添加jar包坐标:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>sun</groupId>
<artifactId>spring03IOC</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging> <dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
</dependencies> </project>

二、ApplicationContext相关

1、ApplicationContext三个常用实现类:

1、ClassPathXmlApplicationContext:
  它可以加载类路径下的配置文件,要求配置文件必须在类路径下。不在的话,加载不了。(更常用)
2、FileSystemXmlApplicationContext:
  它可以加载磁盘任意路径下的配置文件(必须有访问权限)
3、AnnotationConfigApplicationContext:
  它是用于读取注解创建容器。

2、ApplicationContext和BeanFactory接口区别:

1、ApplicationContext(单例对象适用 )
它在构建核心容器时,创建对象采取的策略是采用立即加载的方式。也就是说,只要一读取完配置文件马上就创建配置文件中配置的对象。

  ApplicationContext ac=new ClassPathXmlApplicationContext("bean.xml");
  UserService userService = ac.getBean("userService", UserService.class);
  userService.saveUser(); 2、BeanFactory(多例对象适用 )
它在构建核心容器时,创建对象采取的策略是采用延迟加载的方式。也就是说,什么时候根据id获取对象了,什么时候才真正的创建对象。   Resource resource = new ClassPathResource("bean.xml");
  BeanFactory factory = new XmlBeanFactory(resource);
  UserService as = (UserService)factory.getBean("userService");
  System.out.println(as);

三、Spring的bean相关

1、Spring中bean细节之创建Bean对象的三种方式

1)使用默认构造方法创建

   在Spring的配置文件中使用bean标签,配以id和class属性之后,且没有其他属性和标签时,采用的就是默认构造函数创建bean对象,此时如果类中没有默认构造函数,则对象无法创建。

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
http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="userService" class="sun.service.ServiceImpl.UserServiceImpl"></bean>
</beans>

2)使用工厂类的普通方法创建对象(使用某个类中的方法创建对象,并存入Spring容器)

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
http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="instance" class="sun.factory.InstanceFactory"></bean>
<bean id="userServiceMethod" factory-bean="instance" factory-method="getObj"></bean> </beans>

3)使用工厂类中的静态方法创建对象(使用某个类中的静态方法创建对象,并存入Spring容器)

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
http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="userServiceStatic" class="sun.factory.StaticFactory" factory-method="getObj"></bean> </beans>

2、Spring中bean的作用范围

bean标签的scope属性:
作用:用于指定bean的作用范围
取值: 常用的就是单例的和多例的
singleton:单例的(默认值)
prototype:多例的
request:作用于web应用的请求范围
session:作用于web应用的会话范围
global-session:作用于集群环境的会话范围(全局会话范围),当不是集群环境时,它就是session

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
http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="userService" class="sun.service.ServiceImpl.UserServiceImpl" scope="prototype"></bean> </beans>

3、Bean对象的生命周期

单例对象
出生:当容器创建时对象出生
活着:只要容器还在,对象一直活着
死亡:容器销毁,对象消亡
总结:单例对象的生命周期和容器相同
多例对象
出生:当我们使用对象时spring框架为我们创建
活着:对象只要是在使用过程中就一直活着。
死亡:当对象长时间不用,且没有别的对象引用时,由Java的垃圾回收器回收

UserServiceImpl类:

package sun.service.ServiceImpl;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import sun.service.UserService; /**
* @Classname UserServiceImpl
* @Description TODO
* @Date 2020/9/15 14:52
* @Created by Administrator
*/
public class UserServiceImpl implements UserService {
public void init(){
System.out.println("init...");
} public void saveUser() {
System.out.println("service saveUser方法执行了...");
} public void destory(){
System.out.println("destory...");
}
}

UserWeb类:

package sun.web;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import sun.service.ServiceImpl.UserServiceImpl;
import sun.service.UserService; /**
* @Classname UserWeb
* @Description TODO
* @Date 2020/9/15 14:54
* @Created by Administrator
*/
public class UserWeb {
public static void main(String[] args) {
// 1 获取核心容器对象
ClassPathXmlApplicationContext ac=new ClassPathXmlApplicationContext("bean.xml");
// 2 根据id获取bean对象
UserService userService = ac.getBean("userService", UserService.class);
userService.saveUser();
ac.close();
}
}

1)当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
http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="userService" class="sun.service.ServiceImpl.UserServiceImpl" init-method="init" destroy-method="destory"
scope="singleton"></bean> </beans>

此时运行UserWeb中的main方法:

2)当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
http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="userService" class="sun.service.ServiceImpl.UserServiceImpl" init-method="init" destroy-method="destory"
scope="prototype"></bean> </beans>

此时运行UserWeb中的main方法:

四、Spring中的依赖注入

依赖注入:
  Dependency Injection
IOC的作用:
  降低程序间的耦合(依赖关系)
依赖关系的管理:
  以后都交给spring来维护
在当前类需要用到其他类的对象,由spring为我们提供,我们只需要在配置文件中说明
依赖关系的维护:
  就称之为依赖注入。
依赖注入:
  能注入的数据:有三类
    基本类型和String
    其他bean类型(在配置文件中或者注解配置过的bean)
    复杂类型/集合类型
  注入的方式:有三种
    第一种:使用构造函数提供
    第二种:使用set方法提供
    第三种:使用注解提供(明天的内容)

1、使用构造函数注入

构造函数注入:
使用的标签:constructor-arg
标签出现的位置:bean标签的内部
标签中的属性
type:用于指定要注入的数据的数据类型,该数据类型也是构造函数中某个或某些参数的类型
index:用于指定要注入的数据给构造函数中指定索引位置的参数赋值。索引的位置是从0开始
name:用于指定给构造函数中指定名称的参数赋值 常用的
=============以上三个用于指定给构造函数中哪个参数赋值===============================
value:用于提供基本类型和String类型的数据
ref:用于指定其他的bean类型数据。它指的就是在spring的Ioc核心容器中出现过的bean对象

bean实体类:

package sun.service.ServiceImpl;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import sun.service.UserService; import java.util.Date; /**
* @Classname UserServiceImpl
* @Description TODO
* @Date 2020/9/15 14:52
* @Created by Administrator
*/
public class UserServiceImpl implements UserService { private String name;
private Integer age;
private Date birthday; public UserServiceImpl(String name, Integer age, Date birthday) {
this.name = name;
this.age = age;
this.birthday = birthday;
} public void saveUser() {
System.out.println("service saveUser方法执行了...");
} @Override
public String toString() {
return "UserServiceImpl{" +
"name='" + name + '\'' +
", age=" + age +
", birthday=" + birthday +
'}';
}
}

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
http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="userService" class="sun.service.ServiceImpl.UserServiceImpl">
<constructor-arg name="name" value="kelvin"></constructor-arg>
<constructor-arg name="age" value="23"></constructor-arg>
<constructor-arg name="birthday" ref="time"></constructor-arg>
</bean> <bean id="time" class="java.util.Date"></bean>
</beans>
优势:
  在获取bean对象时,注入数据是必须的操作,否则对象无法创建成功。
弊端:
  改变了bean对象的实例化方式,使我们在创建对象时,如果用不到这些数据,也必须提供。

2、set方法注入(更常用的方式)

 涉及的标签:property
出现的位置:bean标签的内部
标签的属性
name:用于指定注入时所调用的set方法名称
value:用于提供基本类型和String类型的数据
ref:用于指定其他的bean类型数据。它指的就是在spring的Ioc核心容器中出现过的bean对象

bean实体类:

package sun.service.ServiceImpl;

import sun.service.UserService;

import java.util.Date;

/**
* @Classname UserServiceImpl
* @Description TODO
* @Date 2020/9/15 14:52
* @Created by Administrator
*/
public class UserServiceImpl2 implements UserService { private String name;
private Integer age;
private Date birthday; public void setName(String name) {
this.name = name;
} public void setAge(Integer age) {
this.age = age;
} public void setBirthday(Date birthday) {
this.birthday = birthday;
} public void saveUser() {
System.out.println("service saveUser方法执行了...");
} @Override
public String toString() {
return "UserServiceImpl{" +
"name='" + name + '\'' +
", age=" + age +
", birthday=" + birthday +
'}';
}
}

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
http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="time" class="java.util.Date"></bean> <bean id="userService2" class="sun.service.ServiceImpl.UserServiceImpl2">
<property name="name" value="jack"></property>
<property name="age" value="23"></property>
<property name="birthday" ref="time"></property>
</bean>
</beans>
优势:
创建对象时没有明确的限制,可以直接使用默认构造函数
弊端:
如果有某个成员必须有值,则获取对象是有可能set方法没有执行。

* 注入集合数据(可采用构造注入或set注入完成)

复杂类型的注入/集合类型的注入
用于给List结构集合注入的标签:
list array set
用于个Map结构集合注入的标签:
map props
结构相同,标签可以互换

bean实体类:

package sun.service.ServiceImpl;

import sun.service.UserService;

import java.util.*;

/**
* @Classname UserServiceImpl
* @Description TODO
* @Date 2020/9/15 14:52
* @Created by Administrator
*/
public class UserServiceImpl3 implements UserService { private String[] strings;
private List<String> list;
private Set<String> set;
private Map<String,Integer> map;
private Properties prop; public void setStrings(String[] strings) {
this.strings = strings;
} public void setList(List<String> list) {
this.list = list;
} public void setSet(Set<String> set) {
this.set = set;
} public void setMap(Map<String, Integer> map) {
this.map = map;
} public void setProp(Properties prop) {
this.prop = prop;
} public String[] getStrings() {
return strings;
} public List<String> getList() {
return list;
} public Set<String> getSet() {
return set;
} public Map<String, Integer> getMap() {
return map;
} public Properties getProp() {
return prop;
} public void saveUser() {
System.out.println("service saveUser方法执行了...");
System.out.println(Arrays.toString(strings));
System.out.println(this.list);
System.out.println(this.set);
System.out.println(this.map);
System.out.println(this.prop);
} }

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
http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="userService3" class="sun.service.ServiceImpl.UserServiceImpl3">
<property name="strings">
<array>
<value>kelvin</value>
<value>jack</value>
<value>tony</value>
</array>
</property> <property name="set">
<set>
<value>kelvin</value>
<value>jack</value>
<value>tony</value>
</set>
</property> <property name="list">
<list>
<value>kelvin</value>
<value>jack</value>
<value>tony</value>
</list>
</property> <property name="map">
<map>
<entry key="kelvin" value="23"></entry>
<entry key="jack" value="21"></entry>
<entry key="tony">
<value>46</value>
</entry>
</map>
</property> <property name="prop">
<props>
<prop key="kelvin">23</prop>
<prop key="jack">45</prop>
<prop key="tony">32</prop>
</props>
</property>
</bean>
</beans>

Spring基于XML的IOC环境搭建及入门的更多相关文章

  1. 阶段3 2.Spring_03.Spring的 IOC 和 DI_3 spring基于XML的IOC环境搭建和入门

    创建新项目 修改为jar包的方式 把上一个工程内的代码 java下的com复制过来 由于配置文件没有,所以一运行就会报错 factory文件夹整个删除 dao的实现类 这里删除 测试类保留这两行代码 ...

  2. spring基于xml的IOC环境搭建和入门

    配置pom.xml的依赖 <packaging>jar</packaging> <dependencies> <dependency> <grou ...

  3. Spring 框架的概述以及Spring中基于XML的IOC配置

    Spring 框架的概述以及Spring中基于XML的IOC配置 一.简介 Spring的两大核心:IOC(DI)与AOP,IOC是反转控制,DI依赖注入 特点:轻量级.依赖注入.面向切面编程.容器. ...

  4. 01Spring基于xml的IOC配置--入门

    01Spring基于xml的IOC配置 1.创建一个普通的maven工程 1.1 选择maven,不用骨架,点击下一步. 1.2 填写GroupId.ArtifactId.Version.填完点击下一 ...

  5. Ubuntu 基于Docker的TensorFlow 环境搭建

    基于Docker的TensorFlow 环境搭建 基于(ubuntu 16.04LTS/ubuntu 14.04LTS) 一.docker环境安装 1)更新.安装依赖包 sudo apt-get up ...

  6. EOS Dapp开发(1)-基于Docker的开发环境搭建

    随着EOS主网的上线,相信基于EOS的Dapp开发会越来越多,查阅了很多资料相关的开发资料都不是很多,只能自己摸索,按照网上仅有的几篇教程,先git clonehttps://github.com/E ...

  7. 基于Python的Appium环境搭建合集

    自动化一直是测试圈中的热聊,也是大家追求的技术方向.在测试中,往往回归测试也是测试人员的“痛点”.对于迭代慢.变更少的功能,就能用上自动化来替代人工回归,减轻工作量. 问题 在分享环境搭建之前,先抛出 ...

  8. spring基于xml的声明式事务控制配置步骤

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  9. spring 基于xml的申明式AspectH中的后置通知的返回值获取

    spring 基于xml的申明式AspectH中的后置通知的返回值获取 1. 配置文件 <aop:config> <aop:aspect ref="myAspect&quo ...

  10. spring 基于XML的申明式AspectJ通知的执行顺序

    spring 基于XML的申明式AspectJ通知的执行顺序 关于各种通知的执行顺序,结论:与配置文件中的申明顺序有关 1. XML文件配置说明 图片来源:<Java EE企业级应用开发教程&g ...

随机推荐

  1. 基本SQL语句

    说明:几个简单的基本的sql语句 选择:select * from table1 where 范围 插入:insert into table1(field1,field2) values(value1 ...

  2. tp

    ThinkPHP php框架 真实项目开发步骤: 多人同时开发项目,协作开发项目.分工合理.效率有提高(代码风格不一样.分工不好) 测试阶段 上线运行 对项目进行维护.修改.升级(单个人维护项目,十分 ...

  3. echarts异步加载柱状图遇到的错误- Error: Component series. not exists. Load it first.

    今天看了下echarts教程之中的异步加载柱状图,我按照教程中的代码敲出来之后再运行,就报了一个 Error: Component series. not exists. Load it first. ...

  4. 移动审批App开发总结

    公司新需求要在手机上进行审批. 现在开发完成了. 总结:1.初步把公司的工作流模块做成RPC服务,公共服务可以进行调用. 2.服务分层,每个App的页面对应一个服务端的接口,作为前端控制器,用来从更低 ...

  5. uva 558 - Wormholes(Bellman Ford判断负环)

    题目链接:558 - Wormholes 题目大意:给出n和m,表示有n个点,然后给出m条边,然后判断给出的有向图中是否存在负环. 解题思路:利用Bellman Ford算法,若进行第n次松弛时,还能 ...

  6. uiautomatorviewer 可以查看到android中的web 元素信息

    以知乎社区账号登录使用微博账号为例,使用uiautomatorviewer 可以定位到登录框.密码框,需要结合appium的inspector 1.genymotion 模拟器开启,模拟器安卓系统为4 ...

  7. Git 教程(一):简介和安装

    为什么要编写这个教程?因为我在学习Git的过程中,买过书,也在网上Google了一堆Git相关的文章和教程,但令人失望的是,这些教程不是难得令人发指,就是简单得一笔带过,或者,只支离破碎地介绍Git的 ...

  8. 【干货】利用MVC5+EF6搭建博客系统(一)EF Code frist、实现泛型数据仓储以及业务逻辑

    习MVC有一段时间了,决定自己写一套Demo了,写完源码再共享. PS:如果图片模糊,鼠标右击复制图片网址,然后在浏览器中打开即可. 一.框架搭建 二.创建数据库 1.创建一个空的EF code fr ...

  9. Python之操作MySQL数据库

      一.操作步骤 1.导入pymysql模块 2.建立连接(ip.用户名.密码.数据库名.端口号.字符集.(自动提交参数)) 3.建立游标 4.执行sql语句 (4.需要提交的提交) 5.关闭游标 6 ...

  10. hdu5758 思维,树形dp

    /*可以推测从叶子结点传送到叶子节点才能使传送次数最少,如果是偶数个叶子结点,那么传送leaf/2次就是答案,如果是奇数个叶子结点,则还有单独一条链需要覆盖dp[u]表示覆盖完u为根的子树需要走的边数 ...