0、Spring工程构建&Spring快速入门&Spring配置文件详解&注入&Sprint相关API

2023-11-04

1、Spring工程构建

创建工程项目目录文件夹

 IDEA选择项目new一个module

配置案例

aop创建

 创建并下载完毕后,点击file选择projert

选择按照的jdk版本

 output选择当前目录, 点击右下方apply

 选择facets,点击"+"号选择web
选择当前项目

 修改路径

 修改路径

 确认即可。aop创建完成

创建ioc

再次new 一个 module

创建页面配置

  选择facets,点击"+"号选择web

 选择ioc

 修改路径

修改路径

点击ok

  spring项目创建完成

1. Spring简介

1.1 Spring是什么

Spring是分层的 Java SE/EE应用 full-stack 轻量级开源框架,以 IoC(Inverse Of Control:反转控制)和 AOP(Aspect Oriented Programming:面向切面编程)为内核。

提供了展现层 SpringMVC 和持久层 Spring JDBCTemplate 以及业务层事务管理等众多的企业级应用技术,还能整合开源世界众多著名的第三方框架和类库,逐渐成为使用最多的Java EE 企业应用开源框架。

1.2 Spring发展历程

1997 年, IBM提出了EJB 的思想
1998 年,SUN制定开发标准规范 EJB1.0
1999 年,EJB1.1 发布
2001 年,EJB2.0 发布
2003 年,EJB2.1 发布
2006 年,EJB3.0 发布

Rod Johnson ( Spring 之父)
Expert One-to-One J2EE Design and Development(2002)
阐述了 J2EE 使用EJB 开发设计的优点及解决方案
Expert One-to-One J2EE Development without EJB(2004)
阐述了 J2EE 开发不使用 EJB的解决方式(Spring 雏形)

2017  年 9 月份发布了 Spring 的最新版本 Spring5.0 通用版(GA)

1.3 Spring的优势

1)方便解耦,简化开发
     通过 Spring 提供的 IoC容器,可以将对象间的依赖关系交由 Spring 进行控制,避免硬编码所造成的过度耦合。
     用户也不必再为单例模式类、属性文件解析等这些很底层的需求编写代码,可以更专注于上层的应用。

2)AOP 编程的支持
     通过 Spring的 AOP 功能,方便进行面向切面编程,许多不容易用传统 OOP 实现的功能可以通过 AOP 轻松实现。

3)声明式事务的支持
     可以将我们从单调烦闷的事务管理代码中解脱出来,通过声明式方式灵活的进行事务管理,提高开发效率和质量。

4)方便程序的测试
     可以用非容器依赖的编程方式进行几乎所有的测试工作,测试不再是昂贵的操作,而是随手可做的事情。

1.3 Spring的优势

5)方便集成各种优秀框架
     Spring对各种优秀框架(Struts、Hibernate、Hessian、Quartz等)的支持。

6)降低 JavaEE API 的使用难度
     Spring对 JavaEE API(如 JDBC、JavaMail、远程调用等)进行了薄薄的封装层,使这些 API 的使用难度大为降低。

7)Java 源码是经典学习范例
     Spring的源代码设计精妙、结构清晰、匠心独用,处处体现着大师对Java 设计模式灵活运用以及对 Java技术的高深
     造诣。它的源代码无意是 Java 技术的最佳实践的范例。

1.4 Spring的体系结构

2. spring快速入门

2.1 Spring程序开发步骤

①导入 Spring 开发的基本包坐标

②编写 Dao 接口和实现类

③创建 Spring 核心配置文件

④在 Spring 配置文件中配置 UserDaoImpl

⑤使用 Spring 的 API 获得 Bean 实例

2.2 导入Spring开发的基本包坐标

<?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>com.java</groupId>
    <artifactId>spring_ioc</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <spring.version>6.0.4</spring.version>
    </properties>
    <!--导入spring的context坐标,context依赖core、beans、expression-->
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
    </dependencies>

</project>

2.3 编写Dao接口和实现类

接口

package com.java.dao;

public interface UserDao {
    public void save();
}

实现类

package com.java.dao.impl;

import com.java.dao.UserDao;

public class UserDaoImpl implements UserDao {
    public UserDaoImpl(String id) {
    }
    public UserDaoImpl() {
    }
    @Override
    public void save() {
        System.out.println("save running...");
    }
}

2.4 创建Spring核心配置文件

在类路径下(resources)创建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">

 </beans>

2.5 在Spring配置文件中配置UserDaoImpl

<?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.java.dao.impl.UserDaoImpl"></bean>
</beans>

2.6 使用Spring的API获得Bean实例

package com.java.demo;

import com.java.dao.UserDao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class UserDaoDemo {
    public static void main(String[] args) {
        ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserDao userDao = (UserDao) app.getBean("userDao");
        userDao.save();
    }
}

3. Spring配置文件

3.1 Bean标签基本配置

用于配置对象交由Spring 来创建。

默认情况下它调用的是类中的无参构造函数,如果没有无参构造函数则不能创建成功。

基本属性:

id:Bean实例在Spring容器中的唯一标识

class:Bean的全限定名称

3.2 Bean标签范围配置

scope:指对象的作用范围,取值如下:

取值范围 说明
singleton 默认值,单例的
prototype 多例的
request WEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 request 域中
session WEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 session 域中
global session WEB 项目中,应用在 Portlet 环境,如果没有 Portlet 环境那么globalSession 相当于 session

1)当scope的取值为singleton时

​ Bean的实例化个数:1个

​ Bean的实例化时机:当Spring核心文件被加载时,实例化配置的Bean实例

​ Bean的生命周期:

对象创建:当应用加载,创建容器时,对象就被创建了

对象运行:只要容器在,对象一直活着

对象销毁:当应用卸载,销毁容器时,对象就被销毁了

2)当scope的取值为prototype时

​ Bean的实例化个数:多个

​ Bean的实例化时机:当调用getBean()方法时实例化Bean

对象创建:当使用对象时,创建新的对象实例

对象运行:只要对象在使用中,就一直活着

对象销毁:当对象长时间不用时,被 Java 的垃圾回收器回收了

3.3 Bean生命周期配置

init-method:指定类中的初始化方法名称

destroy-method:指定类中销毁方法名称

<!--    生命周期 & 无参构造方式-->
    <!--<bean id="userDao" class="com.java.dao.impl.UserDaoImpl"
          scope="singleton"
          init-method="init"
          destroy-method="destroy"
    ></bean>-->

3.4 Bean实例化三种方式

1) 使用无参构造方法实例化

​ 它会根据默认无参构造方法来创建类对象,如果bean中没有默认无参构造函数,将会创建失败

<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"/>

2) 工厂静态方法实例化

​ 工厂的静态方法返回Bean实例

public class StaticFactoryBean {
    public static UserDao createUserDao(){    
    return new UserDaoImpl();
    }
}

<bean id="userDao" class="com.itheima.factory.StaticFactoryBean" 
      factory-method="createUserDao" />

3) 工厂实例方法实例化

​ 工厂的非静态方法返回Bean实例

public class DynamicFactoryBean {  
	public UserDao createUserDao(){        
		return new UserDaoImpl(); 
	}
}

<bean id="factoryBean" class="com.itheima.factory.DynamicFactoryBean"/>
<bean id="userDao" factory-bean="factoryBean" factory-method="createUserDao"/>

3.5 Bean的依赖注入入门

①创建 UserService,UserService 内部在调用 UserDao的save() 方法

public class UserServiceImpl implements UserService {
	@Override
	public void save() {
         ApplicationContext applicationContext = new 
                 ClassPathXmlApplicationContext("applicationContext.xml");       	           UserDao userDao = (UserDao) applicationContext.getBean("userDao");	
          userDao.save();
 	}
 }

②将 UserServiceImpl 的创建权交给 Spring

<bean id="userService" class="com.itheima.service.impl.UserServiceImpl"/>

③从 Spring 容器中获得 UserService 进行操作

ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = (UserService) applicationContext.getBean("userService");
userService.save();

3.6 Bean的依赖注入概念

 

依赖注入(Dependency Injection):它是 Spring 框架核心 IOC 的具体实现。

在编写程序时,通过控制反转,把对象的创建交给了 Spring,但是代码中不可能出现没有依赖的情况。

IOC 解耦只是降低他们的依赖关系,但不会消除。例如:业务层仍会调用持久层的方法。

那这种业务层和持久层的依赖关系,在使用 Spring 之后,就让 Spring 来维护了。

简单的说,就是坐等框架把持久层对象传入业务层,而不用我们自己去获取

3.7 Bean的依赖注入方式

①构造方法

​ 创建有参构造

public class UserServiceImpl implements UserService {
@Override
public void save() {
ApplicationContext applicationContext = new 
                 ClassPathXmlApplicationContext("applicationContext.xml");       UserDao userDao = (UserDao) applicationContext.getBean("userDao");    
          userDao.save();
    }
 }

配置Spring容器调用有参构造时进行注入

<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"/>
<bean id="userService" class="com.itheima.service.impl.UserServiceImpl">      		   	<constructor-arg name="userDao" ref="userDao"></constructor-arg>
</bean>

②set方法

​ 在UserServiceImpl中添加setUserDao方法

public class UserServiceImpl implements UserService {
    private UserDao userDao;
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;  
        } 
    @Override    
    public void save() {      
   		 userDao.save();
	}
}

配置Spring容器调用set方法进行注入

<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"/>
<bean id="userService" class="com.itheima.service.impl.UserServiceImpl">
	<property name="userDao" ref="userDao"/>
</bean>

set方法:P命名空间注入

​ P命名空间注入本质也是set方法注入,但比起上述的set方法注入更加方便,主要体现在配置文件中,如下:

​ 首先,需要引入P命名空间:

xmlns:p="http://www.springframework.org/schema/p"

其次,需要修改注入方式

 x <bean id="userService" class="com.itheima.service.impl.UserServiceImpl" p:userDao- ref="userDao"/>

3.8 Bean的依赖注入的数据类型

上面的操作,都是注入的引用Bean,处了对象的引用可以注入,普通数据类型,集合等都可以在容器中进行注入。

注入数据的三种数据类型

普通数据类型

引用数据类型

集合数据类型

其中引用数据类型,此处就不再赘述了,之前的操作都是对UserDao对象的引用进行注入的,下面将以set方法注入为例,演示普通数据类型和集合数据类型的注入。

Bean的依赖注入的数据类型

(1)普通数据类型的注入

public class UserDaoImpl implements UserDao {
private String company;
    private int age;
    public void setCompany(String company) {
        this.company = company;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public void save() {
        System.out.println(company+"==="+age);
        System.out.println("UserDao save method running....");   
    }
}

<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl">
    <property name="company" value="心流体验"></property>
    <property name="age" value="15"></property>
</bean>

(2)集合数据类型(List<String>)的注入

public class UserDaoImpl implements UserDao {
	private List<String> strList;
	public void setStrList(List<String> strList) {
		this.strList = strList;
	}
	public void save() {
        System.out.println(strList);
        System.out.println("UserDao save method running....");
	}
}

<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl">
    <property name="strList">
        <list>
            <value>aaa</value>
            <value>bbb</value>
            <value>ccc</value>
        </list>
    </property>
</bean>

(3)集合数据类型(List<User>)的注入

public class UserDaoImpl implements UserDao {
	private List<User> userList;
	public void setUserList(List<User> userList) {
	this.userList = userList;  
 }
public void save() {
	System.out.println(userList);
	System.out.println("UserDao save method running....");
	}
}

<bean id="u1" class="com.itheima.domain.User"/>
<bean id="u2" class="com.itheima.domain.User"/>
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl">
    <property name="userList">
        <list>
            <bean class="com.itheima.domain.User"/>
            <bean class="com.itheima.domain.User"/>
            <ref bean="u1"/>
            <ref bean="u2"/>       
        </list>
    </property>
</bean>

(4)集合数据类型( Map<String,User> )的注入

public class UserDaoImpl implements UserDao {
    private Map<String,User> userMap;
    public void setUserMap(Map<String, User> userMap) {
    this.userMap = userMap;
    }    
public void save() {      
	System.out.println(userMap);
	System.out.println("UserDao save method running....");
	}
}

<bean id="u1" class="com.itheima.domain.User"/>
<bean id="u2" class="com.itheima.domain.User"/>
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl">
    <property name="userMap">
        <map>            
            <entry key="user1" value-ref="u1"/>
            <entry key="user2" value-ref="u2"/>
        </map>
    </property>
</bean>

(5)集合数据类型(Properties)的注入

public class UserDaoImpl implements UserDao {
    private Properties properties;
    public void setProperties(Properties properties) {
        this.properties = properties;
    }
	public void save() {
		System.out.println(properties);
		System.out.println("UserDao save method running....");
	}
}

<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl">
    <property name="properties">
        <props>
            <prop key="p1">aaa</prop>
            <prop key="p2">bbb</prop> 
            <prop key="p3">ccc</prop>
        </props>
    </property>
</bean>

3.9 引入其他配置文件(分模块开发)

实际开发中,Spring的配置内容非常多,这就导致Spring配置很繁杂且体积很大,所以,可以将部分配置拆解到其他配置文件中,而在Spring主配置文件通过import标签进行加载

<import resource="applicationContext-xxx.xml"/>

3.6 知识要点

Spring的重点配置

<bean>标签
    id属性:在容器中Bean实例的唯一标识,不允许重复
    class属性:要实例化的Bean的全限定名
    scope属性:Bean的作用范围,常用是Singleton(默认)和prototype
    <property>标签:属性注入
        name属性:属性名称
        value属性:注入的普通属性值
        ref属性:注入的对象引用值
        <list>标签
        <map>标签
        <properties>标签
    <constructor-arg>标签
<import>标签:导入其他的Spring的分文件

4. spring相关API

4.1 ApplicationContext的继承体系

applicationContext:接口类型,代表应用上下文,可以通过其实例获得 Spring 容器中的 Bean 对象

4.2 ApplicationContext的实现类

1)ClassPathXmlApplicationContext

​ 它是从类的根路径下加载配置文件 推荐使用这种

2)FileSystemXmlApplicationContext

​ 它是从磁盘路径上加载配置文件,配置文件可以在磁盘的任意位置。

3)AnnotationConfigApplicationContext

​ 当使用注解配置容器对象时,需要使用此类来创建 spring 容器。它用来读取注解。

4.3 getBean()方法使用

public Object getBean(String name) throws BeansException {  
	assertBeanFactoryActive();   
	return getBeanFactory().getBean(name);
}
public <T> T getBean(Class<T> requiredType) throws BeansException {   			    	assertBeanFactoryActive();
	return getBeanFactory().getBean(requiredType);
}

其中,当参数的数据类型是字符串时,表示根据Bean的id从容器中获得Bean实例,返回是Object,需要强转。

当参数的数据类型是Class类型时,表示根据类型从容器中匹配Bean实例,当容器中相同类型的Bean有多个时,则此方法会报错

getBean()方法使用

ApplicationContext applicationContext = new 
            ClassPathXmlApplicationContext("applicationContext.xml");
  UserService userService1 = (UserService) applicationContext.getBean("userService");
  UserService userService2 = applicationContext.getBean(UserService.class);

4.4 知识要点

Spring的重点API

ApplicationContext app = new ClasspathXmlApplicationContext("xml文件")
app.getBean("id")
app.getBean(Class)

代码示范

pop.xml

<?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>com.java</groupId>
    <artifactId>spring_ioc</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <spring.version>6.0.4</spring.version>
    </properties>
    <!--导入spring的context坐标,context依赖core、beans、expression-->
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

</project>

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<!--p命名空间-->
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--    生命周期 & 无参构造方式-->
    <!--<bean id="userDao" class="com.java.dao.impl.UserDaoImpl"
          scope="singleton"
          init-method="init"
          destroy-method="destroy"
    ></bean>-->
<!--    静态工厂-->
    <!--<bean id="userDao" class="com.java.factory.StaticFactory"
          scope="singleton"
          factory-method="getUserDao"
    ></bean>-->
<!--    非静态工厂-->
   <!-- <bean id="factory" class="com.java.factory.DynamicFactory"></bean>
    <bean id="userDao" factory-bean="factory" factory-method = "getUserDao"></bean>-->

<!--    普通类型注入-->
   <!-- <bean id="userDao" class="com.java.dao.impl.UserDaoImpl"
          scope="singleton"
    >
        <property name="username" value="张三"></property>
        <property name="age" value="18"></property>

    </bean>-->
<!--    集合注入-->
    <bean id="userDao" class="com.java.dao.impl.UserDaoImpl"
          scope="singleton"
    >
        <property name="strList" >
            <list>
                <value>aaa</value>
                <value>bbb</value>
                <value>ccc</value>
            </list>
        </property>
        <property name="userMap">
            <map>
                <entry key="u1" value-ref="user1"></entry>
                <entry key="u2" value-ref="user2"></entry>
            </map>
        </property>
        <property name="properties">
            <props>
                <prop key="p1" >ppp1</prop>
                <prop key="p2" >ppp2</prop>
                <prop key="p3" >ppp3</prop>
            </props>
        </property>

    </bean>
    <bean id="user1" class="com.java.domain.User">
        <property name="name" value="tom"/>
        <property name="addr" value="guangdong"/>
    </bean>
    <bean id="user2" class="com.java.domain.User">
        <property name="name" value="lucy"/>
        <property name="addr" value="beijing"/>
    </bean>



<!--  引用注入  :   set注入-->
    <!--<bean id="userService" class="com.java.service.impl.UserServiceImpl" scope="singleton">
        <property name="userDao" ref="userDao"></property>
    </bean>-->
    <!--注入p后,修改注入方式-->
    <!--<bean id="userService" class="com.java.service.impl.UserServiceImpl" p:userDao-ref="userDao" scope="singleton">
    </bean>-->
<!--    带参构造注入-->
    <bean id="userService" class="com.java.service.impl.UserServiceImpl"  scope="singleton">
        <constructor-arg name="userDao" ref="userDao"></constructor-arg>
    </bean>

<!--    引入模块-->
    <import resource="applicationContext-user.xml"/>
    <import resource="applicationContext-product.xml"/>

</beans>



UserDao

package com.java.dao.impl;

import com.java.dao.UserDao;
import com.java.domain.User;

import java.util.List;
import java.util.Map;
import java.util.Properties;

public class UserDaoImpl implements UserDao {
    private List<String> strList;
    private Map<String, User> userMap;
    private Properties properties;

    public void setStrList(List<String> strList) {
        this.strList = strList;
    }

    public void setUserMap(Map<String, User> userMap) {
        this.userMap = userMap;
    }

    public void setProperties(Properties properties) {
        this.properties = properties;
    }

    private String username;
    private int age;

    public void setUsername(String username) {
        this.username = username;
    }

    public void setAge(int age) {
        this.age = age;
    }

    /*public UserDaoImpl() {
        System.out.println("UserDaoImpl创建...");
    }
    public UserDaoImpl(String str) {
        System.out.println("UserDaoImpl创建..."+str);
    }
    public void init(){
        System.out.println("初始化方法...");
    }
    public void destroy(){
        System.out.println("销毁方法 ...");
    }*/
    @Override
    public void save() {
//        System.out.println(username+"===="+age);
        System.out.println(strList);
        System.out.println(userMap);
        System.out.println(properties);
        System.out.println("save running...");

    }
}

UserService

package com.java.service.impl;

import com.java.dao.UserDao;
import com.java.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class UserServiceImpl implements UserService {

    private UserDao userDao;

    /*
     * 对象注入
     */
    /*public  void setUserDao(UserDao userDao){
        this.userDao = userDao;
    }

    public void save() {
        userDao.save();
    }*/

    /*构造注入*/

    public UserServiceImpl(UserDao  userDao) {
        this.userDao = userDao;
    }
    
    @Override
    public void save() {
        System.out.println();
        userDao.save();
    }

//    @Override
//    public void save() {
//        ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
//        UserDao userDao = (UserDao) app.getBean("userDao");
//        userDao.save();
//    }
}

User类

package com.java.domain;

public class User {
    private String name;
    private String addr;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddr() {
        return addr;
    }

    public void setAddr(String addr) {
        this.addr = addr;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", addr='" + addr + '\'' +
                '}';
    }
}

DynamicFactory

package com.java.factory;

import com.java.dao.UserDao;
import com.java.dao.impl.UserDaoImpl;

public class DynamicFactory {
    public  UserDao getUserDao() {
        return new UserDaoImpl();
    }
}

StaticFactory

package com.java.factory;

import com.java.dao.UserDao;
import com.java.dao.impl.UserDaoImpl;

public class StaticFactory {
    public static UserDao getUserDao() {
        return new UserDaoImpl();
    }
}

UserController

package com.java.demo;

import com.java.service.UserService;
import com.java.service.impl.UserServiceImpl;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;

public class UserController {
    public static void main(String[] args) {
        /*
        UserService userService = new UserServiceImpl();
        userService.save();
        */
        //UserDaoImpl创建...
        //save running...
       /* ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserService userService = (UserService) app.getBean("userService");
        userService.save();*/

//        对象注入,构造注入
        //非注入则为空指针
//        UserService userService = new UserServiceImpl();
        //文件就在resources类加载路径下面
//        ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
        //加载磁盘文件地址
        String path = "E:\\Java_code\\code\\10.spring\\spring_ioc\\src\\main\\resources\\applicationContext.xml";
        ApplicationContext app = new FileSystemXmlApplicationContext(path);

//        UserService userService = (UserService) app.getBean("userService");//获取的id,具有唯一性
        UserService userService = app.getBean(UserService.class);//如果有多个不同id同意类型,会报错
        userService.save();

    }
}

UserDaoDemo

package com.java.demo;

import com.java.dao.UserDao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class UserDaoDemo {
    public static void main(String[] args) {
        ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserDao userDao = (UserDao) app.getBean("userDao");
        userDao.save();
    }
}

StringTest

package com.java.test;

import com.java.dao.UserDao;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class SpringTest {
    @Test
    /**
     * 测试scope属性
     * scope="singleton"
     */
    public void test1() {
        ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserDao userDao1 = (UserDao) app.getBean("userDao");
        UserDao userDao2 = (UserDao) app.getBean("userDao");
        //UserDaoImpl创建...
        System.out.println(userDao1);
        //com.java.dao.impl.UserDaoImpl@77847718
        System.out.println(userDao2);
        //com.java.dao.impl.UserDaoImpl@77847718

    }
    @Test
    /**
     * 测试scope属性
     * scope="prototype"
     */
    public void test2() {
        ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserDao userDao1 = (UserDao) app.getBean("userDao");
        UserDao userDao2 = (UserDao) app.getBean("userDao");
        //UserDaoImpl创建...
        //UserDaoImpl创建...
        System.out.println(userDao1);
        //com.java.dao.impl.UserDaoImpl@36902638
        System.out.println(userDao2);
        //com.java.dao.impl.UserDaoImpl@223d2c72
    }

    /**
     * Bean生命周期配置
     *
     * init-method:指定类中的初始化方法名称
     *
     * destroy-method:指定类中销毁方法名称
     */
    @Test
    public void test3() {
//        ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
        ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserDao userDao1 = (UserDao) app.getBean("userDao");
        UserDao userDao2 = (UserDao) app.getBean("userDao");
        //UserDaoImpl创建...
        System.out.println(userDao1);//初始化方法...
        //com.java.dao.impl.UserDaoImpl@77847718
//        System.out.println(userDao2);
        //com.java.dao.impl.UserDaoImpl@77847718
        //销毁方法来不及执行,就已经被销毁了,手动关闭可以体现
//        ((ClassPathXmlApplicationContext)app).close();//销毁方法 ...
        app.close();//销毁方法 ...
    }

    /**
     * 静态工厂
     * 非静态工厂
     */
    @Test
    public void test4() {
        ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserDao userDao1 = (UserDao) app.getBean("userDao");
        //UserDaoImpl创建...
        System.out.println(userDao1);
        //com.java.dao.impl.UserDaoImpl@2f9f7dcf
    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

0、Spring工程构建&Spring快速入门&Spring配置文件详解&注入&Sprint相关API 的相关文章

  • Java 枚举与创建位掩码和检查权限的混淆

    我想将此 c 权限模块移植到 java 但是当我无法将数值保存在数据库中然后将其转换为枚举表示形式时 我很困惑如何执行此操作 在 C 中 我创建一个如下所示的枚举 public enum ArticlePermission CanRead
  • 为 java 游戏创建交互式 GUI

    大家好 我正在创建一个类似于 java 中的 farmville 的游戏 我只是想知道如何实现用户通常单击以与游戏客户端交互的交互式对象 按钮 我不想使用 swing 库 通用 Windows 看起来像对象 我想为我的按钮导入自定义图像 并
  • 动态选择端口号?

    在 Java 中 我需要获取端口号以在同一程序的多个实例之间进行通信 现在 我可以简单地选择一些固定的数字并使用它 但我想知道是否有一种方法可以动态选择端口号 这样我就不必打扰我的用户设置端口号 这是我的一个想法 其工作原理如下 有一个固定
  • org.apache.hadoop.security.AccessControlException:客户端无法通过以下方式进行身份验证:[TOKEN,KERBEROS] 问题

    我正在使用 java 客户端通过 Kerberos 身份验证安全访问 HDFS 我尝试打字klist在服务器上 它显示已经存在的有效票证 我收到的异常是客户端无法通过以下方式进行身份验证 TOKEN KERBEROS 帮助将不胜感激 这是一
  • 过滤两次 Lambda Java

    我有一个清单如下 1 2 3 4 5 6 7 和 预期结果必须是 1 2 3 4 5 6 7 我知道怎么做才能到7点 我的结果 1 2 3 4 5 6 我也想知道如何输入 7 我添加了i gt i objList size 1到我的过滤器
  • Java 集合的并集或交集

    建立并集或交集的最简单方法是什么Set在 Java 中 我见过这个简单问题的一些奇怪的解决方案 例如手动迭代这两个集合 最简单的单行解决方案是这样的 set1 addAll set2 Union set1 retainAll set2 In
  • java.lang.IllegalStateException:提交响应后无法调用 sendRedirect()

    这两天我一直在尝试找出问题所在 我在这里读到我应该在代码中添加一个返回 我做到了 但我仍然得到 java lang IllegalStateException Cannot call sendRedirect after the respo
  • 在 junit 测试中获取 javax.lang.model.element.Element 类

    我想测试我的实用程序类 ElementUtils 但我不知道如何将类作为元素获取 在 AnnotationProcessors 中 我使用以下代码获取元素 Set
  • 帮助将图像从 Servlet 获取到 JSP 页面 [重复]

    这个问题在这里已经有答案了 我目前必须生成一个显示字符串文本的图像 我需要在 Servlet 上制作此图像 然后以某种方式将图像传递到 JSP 页面 以便它可以显示它 我试图避免保存图像 而是以某种方式将图像流式传输到 JSP 自从我开始寻
  • jdbc mysql loginTimeout 不起作用

    有人可以解释一下为什么下面的程序在 3 秒后超时 因为我将其设置为在 3 秒后超时 12秒 我特意关闭了mysql服务器来测试mysql服务器无法访问的这种场景 import java sql Connection import java
  • 当 OnFocusChangeListener 应用于包装的 EditText 时,TextInputLayout 没有动画

    不能比标题说得更清楚了 我有一个由文本输入布局包裹的 EditText 我试图在 EditText 失去焦点时触发一个事件 但是 一旦应用了事件侦听器 TextInputLayout 就不再对文本进行动画处理 它只是位于 editText
  • Java 和 Python 可以在同一个应用程序中共存吗?

    我需要一个 Java 实例直接从 Python 实例数据存储中获取数据 我不知道这是否可能 数据存储是否透明 唯一 或者每个实例 如果它们确实可以共存 都有其单独的数据存储 总结一下 Java 应用程序如何从 Python 应用程序的数据存
  • logcat 中 mSecurityInputMethodService 为 null

    我写了一点android应显示智能手机当前位置 最后已知位置 的应用程序 尽管我复制了示例代码 并尝试了其他几种解决方案 但似乎每次都有相同的错误 我的应用程序由一个按钮组成 按下按钮应该log经度和纬度 但仅对数 mSecurityInp
  • java for windows 中的文件图标叠加

    我正在尝试像 Tortoise SVN 或 Dropbox 一样在文件和文件夹上实现图标叠加 我在网上查了很多资料 但没有找到Java的解决方案 Can anyone help me with this 很抱歉确认您的担忧 但这无法在 Ja
  • 专门针对 JSP 的测试驱动开发

    在理解 TDD 到底是什么之前 我就已经开始编写测试驱动的代码了 在没有实现的情况下调用函数和类可以帮助我以更快 更有效的方式理解和构建我的应用程序 所以我非常习惯编写代码 gt 编译它 gt 看到它失败 gt 通过构建其实现来修复它的过程
  • 非 Spring 托管类中 DI 的编译时编织

    我想为标记为的类配置编译时编织 Configurable注释能够将 spring 依赖项注入到初始化的类中new操作员 我不想使用加载时编织 因为我无权访问应用程序服务器的运行脚本 因此无法修改它 另外 我希望能够在测试中使用此类 我的意思
  • 如何使用mockito模拟构建器

    我有一个建造者 class Builder private String name private String address public Builder setName String name this name name retur
  • 在java中为组合框分配键

    我想添加一个JComboBox在 Swing 中这很简单 但我想为组合中的每个项目分配值 我有以下代码 JComboBox jc1 new JComboBox jc1 addItem a jc1 addItem b jc1 addItem
  • 使用 svn 1.8.x、subclise 1.10 的 m2e-subclipse 连接器在哪里?

    我读到 m2e 的生产商已经停止生产 svn 1 7 以外的任何版本的 m2e 连接器 Tigris 显然已经填补了维护 m2e subclipse 连接器的空缺 Q1 我的问题是 使用 svn 1 8 x 的 eclipse 更新 url
  • Spring Boot 无法更新 azure cosmos db(MongoDb) 上的分片集合

    我的数据库中存在一个集合 documentDev 其分片键为 dNumber 样本文件 id 12831221wadaee23 dNumber 115 processed false 如果我尝试使用以下命令通过任何查询工具更新此文档 db

随机推荐

  • 第97天学习打卡(Spring Boot 初识Spring Boot)

    微服务阶段 javase OOP mysql 持久化 html css js jquery 框架 视图 框架不熟练 css不好 javaweb 独立开发MVC三层架构的网站 原始 ssm 框架 简化了我们的开发流程 配置也开始较为复杂 wa
  • Java中if-else和switch-case

    计算机的任何简单或复杂的程序都可以由三种基本结构组成 顺序结构 按照程序编写的顺序 从上到下依次执行 选择结构 根据某个条件进行判断后 选择其中一个分支执行 循环结构 反复执行某个或某些操作 直到条件为假时才停止循环 条件判断结构 1 if
  • CSS命名规范——BEM思想(非常赞的规范)

    人们问我最多的问题之一是在CSS类名中 和 是什么意思 它们的出现是源于BEM和Nicolas Gallagher BEM的意思就是块 block 元素 element 修饰符 modifier 是由Yandex团队提出的一种前端命名方法论
  • 软件研发过程中的5种最常见的图

    一 背景 软件研发过程中 我们常有如下的困惑 有时我们需要设计一个较大型的业务系统 或者做一个开源项目 我们该如何将这个系统的整体功能 逻辑细节一层层描述清楚呢 我们接手了一个大型复杂的系统 该如何一点点从宏观到微观的去梳理整个功能流转的脉
  • Apache APISIX Dashboard 任意命令执行批量编写工具

    Apache APISIX Dashboard远程命令执行漏洞 CVE 2021 45232 漏洞描述 Apache APISIX 是一个动态 实时 高性能的 API 网关 提供负载均衡 动态上游 灰度发布 服务熔断 身份认证 可观测性等丰
  • Verilog 层次化文件设计——彩灯控制器

    Verilog 层次化文件设计是通过顶层文件 调用的子模块来完成代码功能的实现 这里的顶层文件可以理解为是实体电路中的连线步骤 而子模块就是电路元件 本文采用文本形式编写顶层文件 设置顶层文件先打开文件界面显示所有文件 再选择你要设置为顶层
  • 第四十章、PyQt显示部件:QGraphicsView图形视图和QGraphicsScene图形场景简介及应用案例

    专栏 Python基础教程目录 专栏 使用PyQt开发图形界面Python应用 专栏 PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 一 概述 Designer中的Graphics View部件是个图形视图部件 对应类为QG
  • 使用Tor遇到的错误

    Tor 在启动期间退出 这可能是您的 torrc 文件存在错误 Tor 或系统其他程序存在问题 或者硬件问题 在您解决此问题并重新启动 Tor 前 Tor 浏览器将不会启动 答 Windows安装Tor后 会在桌面留下文件夹 Tor 删除后
  • 金士顿 DT101 G2 8GU盘量产全过程图解(群联篇)(2)

    首先用芯片无忧或群联量产工具版本选择查看器 APExample getinfo 读出U盘的 MP ver 固件版本 固件日期 版本 控制芯片制造商是群联 芯片型号为ps2250 以便正确选择使用的量产工具 如下图1 这是从群联量产工具版本选
  • CVE-2021-41773漏洞复现

    1 安装debian系统 首先我选择的系统是debian10版本 也可以在别的系统完成复现 我想一个纯净版 所有重新安装了一个系统 安装步骤简单展示一下 1 创建虚拟机 点击下一步 导入镜像 自己选安装的位置以及虚拟机的名称 安装过程需要设
  • sql语句合集大全(个人总结)

    查找emp表 select from emp 查找emp表的sal select a SAL from emp a 查找emp表的ename select a ename from emp a emp表的sal 10 select a SA
  • 六大设计原则--迪米特法则【Low Of Demeter】

    声明 本文内容是从网络书籍整理而来 并非原创 定义 迪米特法则也叫做最少知识原则 Least Knowledge Principle 指一个对象应该对其他对象有最少的了解 通俗的讲 一个类对自己需要耦合或者调用的类应该知道的最少 你类内部是
  • idea打包springboot项目并部署至服务器

    idea打包springboot项目并部署至服务器 Step1 如果项目没有webapp或web目录 Step2 将springboot导成jar包 Step3 将springboot部署至云服务器 Step1 如果项目没有webapp或w
  • GCP: AppEngine(GAE)的使用

    一 基本概念 在全托管式的无服务器平台上构建可扩缩性极强的应用 将应用从零无缝扩容到全球级规模 而不用费心管理底层基础架构 得益于零服务器管理和零配置部署 开发者可以专注于构建出色的应用 省去管理开销 App Engine 支持多种主流开发
  • 使用ab进行并发压测SSL read failed (5) - closing connection错误

    最近在进行并发压测 在c参数特别大的时候 测试过程中出现SSL read failed 5 closing connection错误 研究好久没有找到瓶颈 但在换了一台测试服务器后 这个问题没有出现 所以基本可以确定是测试服务器产生的瓶颈
  • Java中整型数据的进制书写

    问题描述 我觉得这是一个比较有趣的事情 我觉得大多数初学者在编程过程中都不会在源代码里用除了十进制的其它进制写常量 但是当我在做leetcode的 回文数字 一题时 写了个测试样例 以为int 0343可以被识别为343 从而被识别成回文数
  • combo 添加listeners,使用 initComponent、constructor 的区别

    LocationCombo Ext extend Ext form ComboBox initComponent function var config name loactionCombo hiddenName loactionCombo
  • Unity 使用Final IK实现拟真调整物体IK动画

    文章目录 IK部分 需求 何为IK 参考资料 Final IK概述 手部IK效果 IK交互 拿取与双手调整效果 演示视频 IK部分 需求 NPC拿起物体 指定转向放到指定位置 要求动作尽可能自然 贴近真实 何为IK 谈IK之前先讲一下正向运
  • 【计算机网络】数据链路层(二):差错检测和纠正

    帧同步虽然可以区分每个数据帧的起始和结束 但是还没有解决数据正确传输的两方面问题 一 如果有帧出现了错误 二 如果有帧丢失了 这都是数据链路层确保向网络层提供可靠数据传输服务解决的问题 也就是数据链路层的差错控制功能 要实现差错控制功能 就
  • 0、Spring工程构建&Spring快速入门&Spring配置文件详解&注入&Sprint相关API

    1 Spring工程构建 创建工程项目目录文件夹 IDEA选择项目new一个module 配置案例 aop创建 创建并下载完毕后 点击file选择projert 选择按照的jdk版本 output选择当前目录 点击右下方apply 选择fa