当前位置: 首页 > news >正文

高端定制网站建设制作3d建模怎么做网站旋转

高端定制网站建设制作,3d建模怎么做网站旋转,成都有没有做网站建设的,如何自己建营销网站对象已经能交给Spring的IOC容器来创建了,但是容器是如何来创建对象的呢? 就需要研究下bean的实例化过程,在这块内容中主要解决两部分内容,分别是 bean是如何创建的 实例化bean的三种方式,构造方法,静态工厂和实例工厂 在讲解这…

对象已经能交给Spring的IOC容器来创建了,但是容器是如何来创建对象的呢?

就需要研究下bean的实例化过程,在这块内容中主要解决两部分内容,分别是

  • bean是如何创建的

  • 实例化bean的三种方式,构造方法,静态工厂实例工厂

在讲解这三种创建方式之前,我们需要先确认一件事:bean本质上就是对象,对象在new的时候会使用构造方法完成,那创建bean也是使用构造方法完成的。

基于这个知识点出发,我们来验证spring中bean的三种创建方式。

目录

一、构造方法实例化

优化

二、静态工厂实例化

使用工厂来创建对象

优化

三、实例工厂实例化

优化:FactoryBean使用

小结


一、构造方法实例化

优化

(1)准备需要被创建的类

准备一个BookDao和BookDaoImpl类,

package com.water.dao;public interface BookDao {public void save();
}

在BookDaoImpl类中添加一个无参构造函数,并打印一句话,方便观察结果。 

package com.water.dao.impl;import com.water.dao.BookDao;public class BookDaoImpl implements BookDao {public BookDaoImpl() {System.out.println("book dao constructor is running ....");}public void save() {System.out.println("book dao save ...");}
}

(2)将类配置到Spring容器

<?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标签标示配置beanid属性标示给bean起名字class属性表示给bean定义类型--><bean id="bookDao" class="com.water.dao.impl.BookDaoImpl"></bean>
</beans>

(3)运行程序,如果控制台有打印构造函数中的输出,说明Spring容器在创建对象的时候也走的是构造函数

(4)将构造函数改成private测试

运行程序,能执行成功,

说明内部走的依然是构造函数,能访问到类中的私有构造方法,显而易见Spring底层用的是反射。

(5)构造函数中添加一个参数测试

运行程序,程序会报错,说明Spring底层使用的是类的无参构造方法。

接下来,我们主要研究下Spring的报错信息,来学一学如阅读。

  • 错误信息从下往上依次查看,因为上面的错误大都是对下面错误的一个包装,最核心错误是在最下面

  • Caused by: java.lang.NoSuchMethodException: com.itheima.dao.impl.BookDaoImpl.<init>()

    • Caused by 翻译为引起,即出现错误的原因

    • java.lang.NoSuchMethodException:抛出的异常为没有这样的方法异常

    • com.itheima.dao.impl.BookDaoImpl.<init>():哪个类的哪个方法没有被找到导致的异常,<init>()指定是类的构造方法,即该类的无参构造方法

如果最后一行错误获取不到错误信息,接下来查看第二层:

Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.itheima.dao.impl.BookDaoImpl]: No default constructor found; nested exception is java.lang.NoSuchMethodException: com.itheima.dao.impl.BookDaoImpl.<init>()

  • nested:嵌套的意思,后面的异常内容和最底层的异常是一致的

  • Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.itheima.dao.impl.BookDaoImpl]: No default constructor found;

    • Caused by: 引发

    • BeanInstantiationException:翻译为bean实例化异常

    • No default constructor found:没有一个默认的构造函数被发现

看到这其实错误已经比较明显,

Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'bookDao' defined in class path resource [applicationContext.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.itheima.dao.impl.BookDaoImpl]: No default constructor found; nested exception is java.lang.NoSuchMethodException: com.itheima.dao.impl.BookDaoImpl.<init>()。

至此,关于Spring的构造方法实例化就已经学习完了,因为每一个类默认都会提供一个无参构造函数,所以其实真正在使用这种方式的时候,我们什么也不需要做。这也是我们以后比较常用的一种方式。

二、静态工厂实例化

使用工厂来创建对象

在讲这种方式之前,我们需要先回顾一个知识点是使用工厂来创建对象的方式:

  1. 准备一个OrderDao和OrderDaoImpl类
  2. 创建一个工厂类OrderDaoFactory并提供一个静态方法
  3. 编写AppForInstanceOrder运行类,在类中通过工厂获取对象
public interface OrderDao {public void save();
}public class OrderDaoImpl implements OrderDao {public void save() {System.out.println("order dao save ...");}
}
//静态工厂创建对象
public class OrderDaoFactory {public static OrderDao getOrderDao(){return new OrderDaoImpl();}
}
public class AppForInstanceOrder {public static void main(String[] args) {//通过静态工厂创建对象OrderDao orderDao = OrderDaoFactory.getOrderDao();orderDao.save();}
}

如果代码中对象是通过上面的这种方式来创建的,如何将其交给Spring来管理呢?

优化

这就要用到Spring中的静态工厂实例化的知识了,具体实现步骤为:

(1)在spring的配置文件application.properties中添加以下内容,

<?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标签标示配置beanid属性标示给bean起名字class属性表示给bean定义类型 工厂类的类全名factory-mehod:具体工厂类中创建对象的方法名--><bean id="orderDao" class="com.water.dao.factory.OrderDaoFactory" factory-method="getOrderDao"/>
</beans>

(3)在AppForInstanceOrder运行类,使用从IOC容器中获取bean的方法进行运行测试,

package com.water;import com.water.dao.BookDao;
import com.water.dao.OrderDao;
import com.water.dao.factory.OrderDaoFactory;
import com.water.server.BookService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class App {public static void main( String[] args ) {ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");OrderDao orderDao = (OrderDao) ctx.getBean("orderDao");orderDao.save();}
}

运行后,可以查看到结果, 

这样的好处就是,在工厂的静态方法中,我们除了new对象还可以做其他的一些业务操作,这些操作必不可少。

public class OrderDaoFactory {public static OrderDao getOrderDao(){System.out.println("factory setup....");//模拟必要的业务操作return new OrderDaoImpl();}
}

 之前new对象的那种方式就无法添加其他的业务内容。

三、实例工厂实例化

package com.water.dao;public interface OrderDao {public void save();
}

 

package com.water.dao.impl;import com.water.dao.OrderDao;public class OrderDaoImpl implements OrderDao {public void save() {System.out.println("order dao save ...");}
}
package com.water;import com.water.dao.BookDao;
import com.water.dao.OrderDao;
import com.water.dao.factory.OrderDaoFactory;
import com.water.server.BookService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class App {public static void main( String[] args ) {//创建实例工厂对象OrderDaoFactory OrderDaoFactory = new OrderDaoFactory();//通过实例工厂对象创建对象OrderDao OrderDao = OrderDaoFactory.getOrderDao();OrderDao.save();}
}

对于上面这种实例工厂的方式如何交给Spring管理呢?

优化:FactoryBean使用

(1)创建一个OrderDaoFactoryBean的类,实现FactoryBean接口,重写接口的方法

FactoryBean接口其实会有三个方法,分别是:

T getObject() throws Exception;Class<?> getObjectType();default boolean isSingleton() {return true;
}

方法一:getObject(),被重写后,在方法中进行对象的创建并返回

方法二:getObjectType(),被重写后,主要返回的是被创建类的Class对象

方法三:没有被重写,因为它已经给了默认值,从方法名中可以看出其作用是设置对象是否为单例,默认true,单例。

package com.water.dao.factory;import com.water.dao.OrderDao;
import com.water.dao.impl.OrderDaoImpl;
import org.springframework.beans.factory.FactoryBean;public class OrderDaoFactoryBean implements FactoryBean<OrderDao> {@Overridepublic OrderDao getObject() throws Exception {return new OrderDaoImpl();}@Overridepublic Class<?> getObjectType() {return OrderDao.class;}public boolean isSingleton() {return false;}
}

(2)在Spring的配置文件中进行配置

<?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标签标示配置beanid属性标示给bean起名字class属性表示给bean定义类型 工厂类的类全名factory-mehod:具体工厂类中创建对象的方法名--><bean id="orderDao" class="com.water.dao.factory.OrderDaoFactoryBean"/>
</beans>

(3)运行类不用做任何修改,直接运行,

package com.water;import com.water.dao.BookDao;
import com.water.dao.OrderDao;
import com.water.dao.factory.OrderDaoFactory;
import com.water.server.BookService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class App {public static void main( String[] args ) {//创建实例工厂对象ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");OrderDao orderDao1 = (OrderDao) ctx.getBean("orderDao");System.out.println(orderDao1);OrderDao orderDao2 = (OrderDao) ctx.getBean("orderDao");System.out.println(orderDao2);}
}

通过验证,会发现默认是单例,那如果想改成单例具体如何实现?只需要将isSingleton()方法进行重写,修改返回为false即可。

重新运行,查看结果,

从结果中可以看出现在已经是非单例了,但是一般情况下我们都会采用单例,也就是采用默认即可。所以isSingleton()方法一般不需要进行重写。

小结

通过这一节的学习,需要掌握:

(1)bean是如何创建的呢?

构造方法

(2)Spring的IOC实例化对象的三种方式分别是:

  • 构造方法(常用)

  • 静态工厂(了解)

  • 实例工厂(了解)

    • FactoryBean(实用)

这些方式中,重点掌握构造方法FactoryBean即可。

需要注意的一点是,构造方法在类中默认会提供,但是如果重写了构造方法,默认的就会消失,在使用的过程中需要注意,如果需要重写构造方法,最好把默认的构造方法也重写下。

http://www.yayakq.cn/news/885148/

相关文章:

  • 北京电子商务网站制作网页设计实训报告3篇
  • app手机网站模板国内付费代理ip哪个好
  • 网站排名优化平台深圳做个商城网站设计
  • 网站建设属什么资产wordpress 欢迎插件
  • 北京做公司网站公司苏州 营销型网站 高端网站
  • 商务网站管理的主要内容数据管理物流托运
  • 济南网站建设铭盛信息建站必须要域名吗
  • 网页设计与网站建设实战大全国外网站A
  • 凤翔网站开发推荐专业做网站公司
  • 湖南省城乡建设厅网站石碣镇网站仿做
  • 苏州建网站的公司平台收费标准友链出售
  • 郑州网站推广公司信息越秀区pc端网站建设
  • 高端个人网站教材资源网站建设
  • 网站建设所需的硬软件专业网站设计团队
  • 网站制作时百度文库首页官网
  • 网站建设内容与实现功能郑州优秀网站建设公司
  • 网站运行与维护wordpress调用置顶分类
  • 不让在建设门户网站邮箱企业邮箱入口
  • 建设网站域名有了还要什么佟年帮韩商言做网站是第几集
  • 云服务器可以做多个网站如何在百度做免费推广产品
  • 政务内网网站群建设app开发工具下载
  • 企业网站栏目结构你做的网站会不会被人模仿
  • 海外网站制作张雪峰谈工业设计
  • 免费网站安全软件下载wordpress架构
  • 网站图片的像素十大app开发公司
  • 和国外做贸易用什么网站湖南人文科技学院是几本
  • 如何做好网站手机网站 禁止缩放
  • 网站定制解决方案影视app制作
  • 健康养老网站建设网站空间价格
  • 网站建设管理情况汇报17网一起做网店潮汕