1、Spring 容器加载的3种方式

public class ServiceTest {
public static void main(String[] args) {
//Spring容器加载有3种方式 //第一种:ClassPathXmlApplicationContext ClassPath类路径加载,指的就是classes路径
//第一种:最常用,spring的配置文件路径以后就直接放在src
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); //第二种方式:文件系统路径获得配置文件【绝对路径】
//ApplicationContext context = new FileSystemXmlApplicationContext("C:\\Users\\Desktop\\IDEAWorkspace\\spring-01\\src\\com\\rookie\\beans.xml"); //第三种方式:使用BeanFactory(了解)
//String path = "C:\\Users\\Desktop\\IDEAWorkspace\\spring-01\\src\\com\\rookie\\beans.xml";
//BeanFactory factory = new XmlBeanFactory(new FileSystemResource(path));
//IUserService user = (IUserService) factory.getBean("userService");
//user.add(); IUserService user = (IUserService) context.getBean("userService");
user.add();
}
}

Spring内部创建对象的原理

a.解析xml文件,获取类名,id,属性等。

b.通过反射,用类型创建对象。

c.给创建的对象赋值。

2、BeanFactory 和 ApplicationContext对比

BeanFactory 采取延迟加载,第一次 getBean 时才会初始化 Bean。

ApplicationContext 是即时加载,对 BeanFactory 扩展,提供了更多功能。

  • 案例演示(在第一次的代码基础上)

    public class UserServiceImpl implements UserService {
    
        private String name;
    
        public void setName(String name) {
    this.name = name;
    } @Override
    public void add() {
    System.out.println("创建用户...." + name);
    } public UserServiceImpl(){
    System.out.println("UserServiceImpl() 调用了");
    }
    }
    public class ServiceTest {
    
        public static void main(String[] args) {
    //1.加载beans.xml 这个spring的配置文件,内部就会创建对象
    ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
    }
    }

    控制台打印日志:UserServiceImpl( ) 调用了

    public class ServiceTest {
    
        public static void main(String[] args) {
    String path = "C:\\Users\\Desktop\\IDEAWorkspace\\spring-01\\src\\com\\rookie\\beans.xml";
    BeanFactory factory = new XmlBeanFactory(new FileSystemResource(path)); // 要使调用空参构造可以放开这段代码即可
    // IUserService user = (IUserService) factory.getBean("userService");
    }
    }

    控制台没有打印日志,说明空参构造没有被调用。

    放开上面注释的代码,即可调用空参构造,控制台打印日志:UserServiceImpl( ) 调用了。

2、Spring 容器装配 bean 的 3 种方式

所谓的装配bean就是在xml写一个bean标签。

<?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的三种方式,所谓的装配bean就是在xml写一个bean标签--> <!-- 第一种方式: new 实现类-->
<bean id="userService1" class="com.example.demo.service.impl.UserServiceImpl">
<property name="name" value="zhangsan"></property>
</bean> <!-- 第二种方式:通过静态工厂方法 -->
<bean id="userService2" class="com.example.demo.service.UserServiceFactory" factory-method="createUserService"/> <!--第三种方式:通过实例工厂方法 -->
<bean id="factory2" class="com.example.demo.service.UserServiceFactory2"/>
<bean id="userService3" factory-bean="factory2" factory-method="createUserService"/>
</beans>

测试上面哪种 bean 装配方式,需要注释掉其他 bean装配方式。

第一种上次已经讲过,现在只讲第二、三种案例。

public class UserServiceFactory {
public static UserService createUserService() {
return new UserServiceImpl();
}
} =========================================================================================
public class UserServiceFactory2 {
public UserService createUserService() {
return new UserServiceImpl();
}
}

执行测试函数

public class ServiceTest {

    public static void main(String[] args) {

        //new 对象
ApplicationContext context1 = new ClassPathXmlApplicationContext("beans.xml");
UserService userService1 = (UserService) context1.getBean("userService1");
userService1.add(); //静态工厂
ApplicationContext context2 = new ClassPathXmlApplicationContext("beans.xml");
UserService userService2 = (UserService) context2.getBean("userService2");
userService2.add(); //实例工厂
ApplicationContext context3 = new ClassPathXmlApplicationContext("beans.xml");
UserService userService3 = (UserService) context3.getBean("userService3");
userService3.add(); }
}

感兴趣的可以自己看执行结果。三种结果都证明 bean 被 Spring 容器管理实例化了。

3、bean的作用域(掌握 singleton、prototype)

类别 说明
singleton 在Spring IoC容器中仅存在一个Bean实例,Bean以单例方式存在,默认值
prototype 每次从容器中调用Bean时,都返回一个新的实例,即每次调用getBean()时 ,相当于执行new XxxBean()
request 每次HTTP请求都会创建一个新的Bean,该作用域仅适用于WebApplicationContext环境
session 同一个HTTP Session 共享一个Bean,不同Session使用不同Bean,仅适用于WebApplicationContext 环境
globalSession 一般用于Portlet应用环境,该作用域仅适用于WebApplicationContext 环境

案例代码演示

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="userService1" class="com.example.demo.service.impl.UserServiceImpl" scope="prototype">
</bean>
</beans>
public class ServiceTest {

    public static void main(String[] args) {

        ApplicationContext context1 = new ClassPathXmlApplicationContext("beans.xml");
UserService userService1 = (UserService) context1.getBean("userService1");
UserService userService2 = (UserService) context1.getBean("userService1");
System.out.println(userService1);
System.out.println(userService2);
}
}

控制台信息如下:

com.example.demo.service.impl.UserServiceImpl@2a556333

com.example.demo.service.impl.UserServiceImpl@7d70d1b1

如果去掉 bean.xml 文件的 scope="prototype",打印信息如下:

com.example.demo.service.impl.UserServiceImpl@7a187f14

com.example.demo.service.impl.UserServiceImpl@7a187f14

所以Spring IoC容器Bean以单例方式默认存在!!配置的话根据自己需要配置单例或者多例

Spring 讲解(二 )的更多相关文章

  1. Redis实战之征服 Redis + Jedis + Spring (二)

    不得不说,用哈希操作来存对象,有点自讨苦吃! 不过,既然吃了苦,也做个记录,也许以后API升级后,能好用些呢?! 或许,是我的理解不对,没有真正的理解哈希表. 相关链接: Redis实战 Redis实 ...

  2. Spring Boot(二十):使用spring-boot-admin对spring-boot服务进行监控

    Spring Boot(二十):使用spring-boot-admin对spring-boot服务进行监控 Spring Boot Actuator提供了对单个Spring Boot的监控,信息包含: ...

  3. spring batch(二):核心部分(1):配置Spring batch

    spring batch(二):核心部分(1):配置Spring batch 博客分类: Spring 经验 java   chapter 3.Batch configuration 1.spring ...

  4. Spring Boot 二十个注解

    Spring Boot 二十个注解 占据无力拥有的东西是一种悲哀. Cold on the outside passionate on the insede. 背景:Spring Boot 注解的强大 ...

  5. 风炫安全web安全学习第三十七节课 15种上传漏洞讲解(二)

    风炫安全web安全学习第三十七节课 15种上传漏洞讲解(二) 05后缀名黑名单校验之上传.htaccess绕过 还是使用黑名单,禁止上传所有web容器能解析的脚本文件的后缀 $is_upload = ...

  6. Spring Boot(二):数据库操作

    本文主要讲解如何通过spring boot来访问数据库,本文会演示三种方式来访问数据库,第一种是JdbcTemplate,第二种是JPA,第三种是Mybatis.之前已经提到过,本系列会以一个博客系统 ...

  7. spring学习(二) ———— AOP之AspectJ框架的使用

    前面讲解了spring的特性之一,IOC(控制反转),因为有了IOC,所以我们都不需要自己new对象了,想要什么,spring就给什么.而今天要学习spring的第二个重点,AOP.一篇讲解不完,所以 ...

  8. Spring(二十):Spring AOP(四):基于配置文件的方式来配置 AOP

    基于配置文件的方式来配置 AOP 前边三个章节<Spring(十七):Spring AOP(一):简介>.<Spring(十八):Spring AOP(二):通知(前置.后置.返回. ...

  9. Spring系列(二):Spring IoC/DI的理解

    这几天重新学习了一下Spring,在网上找了相关的ppt来看,当看到Spring IoC这一章节的时候,先大致浏览了一下内容,有将近50页的内容,内心窃喜~QAQ~,看完这些内容能够对IoC有更深层次 ...

随机推荐

  1. vmware版本选择

    vmware哪个版本好用 2014-03-10 22:59一枚小白3 | 分类:常见软件 | 浏览6743次 准备装ghost xp,想问下哪个版本更适合?或者现在哪个版本更稳定,求不要复制,求大神解 ...

  2. 浅析弹性公网IP付费模式和短时升配功能介绍

    ​ 弹性公网IP付费模式对比 弹性公网IP(EIP),有两种付费方式.一种是预付费,一种是后付费.对于预付费弹性公网IP而言,最大的优点就是带宽费用便宜,相对于后付费有比较大的优惠. 例如,杭州地域6 ...

  3. .NET Core 使用 nlog 进行日志记录

    1.运行环境 开发工具:Visual Studio 2017 JDK版本:.NET Core 2.0 项目管理工具:nuget 2.GITHUB地址 https://github.com/nbfujx ...

  4. 2018-2019-2 20175307实验三《敏捷开发与XP实践》实验报告

    实验三 敏捷开发与XP实践-1 1.仔细学习了http://www.cnblogs.com/rocedu/p/4795776.html,发布了一篇关于Google的Java编码的博客,具体内容就不在这 ...

  5. 20175203 2018-2019-2 实验一《Java开发环境的熟悉》实验报告

    20175203 2018-2019-2 实验一<Java开发环境的熟悉> 实验内容及步骤 使用JDK编译.运行简单的Java程序 此代码较为基础,主要是为了让我们熟悉JDK编程环境及如何 ...

  6. PyQuery爬取历史天气信息

    1.准备工作: 网址:https://lishi.tianqi.com/xian/index.html 爬虫类库:PyQuery,requests 2.网页分析: 红线部分可更改为需要爬取的城市名,如 ...

  7. ASP.NET免费发送邮件|

    因为之前有做过邮件发送的项目,最近也看一些朋友问起这个的做法,现在拿来给大家查看下.因为那时候是公司的服务器配置的.所以后来自己便在网上找到了一个可以任何个人都是可以使用的邮件发送.小弟新手,高手看到 ...

  8. Understanding identities in IIS

    Understanding identities in IIS https://support.microsoft.com/en-my/help/4466942/understanding-ident ...

  9. 头疼3-4次的问题,数据从DB导出到EXCEL,再从EXCEL导入到DB,数据格式发生错误 ,导致 程序出错。

    反思: 1 解决 问题的思路 绕远了: 在这个问题出现前,程序是运行正确 的 问题出现前,我误删了DB 的 testcase表的所有 case ,然后 再把邮件 中的excel数据导入到 DB 然后 ...

  10. 《单词的减法》state1~state17(第二遍学习记录)

    单词的减法(二) 2016.05.18.2016.05.21 state 1 advisory 顾问的,劝告的 anticipate/participate 期望/参加 state 2 applian ...