Spring相关配置比较简单:直接导入maven包就能使用框架
步骤1 添加依赖
<dependencies>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
</dependencies>
步骤2 编写实体类
public class User {
private Integer id;
private String name;
private String password;
private String address;
public User() {
}
public User(Integer id, String name, String password, String address) {
this.id = id;
this.name = name;
this.password = password;
this.address = address;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", password='" + password + '\'' +
", address='" + address + '\'' +
'}';
}
}
步骤3 配置ioc.xml文件
我们使用xml文件配置属性值,也可以使用注解方式将实体类注册到容器中,主要是在xml文件中开启注解扫描,然后在实体类上添加@Repository @Component @Controller @Service 来实现对象注入方式
<?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">
<!--开启注解,注解扫描文件夹位置-->
<!--<context:component-scan base-package="com.jyk"></context:component-scan>-->
<!--将实体类注册到容器中,当需要的时候容器自动提供实体类,控制反转(思想) :依赖注入,利用反射机制;因此反射是框架的核心思想-->
<bean id="user" class="com.jyk.bean.User">
<property name="id" value="1"></property>
<property name="name" value="root"></property>
<property name="password" value="root"></property>
<property name="address" value="北京市"></property>
</bean>
</beans>
步骤4 测试类
public class Testdemo {
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("ioc.xml");
User user = applicationContext.getBean("user", User.class);
System.out.println(user);
}
}
测试结果
此过程完成SpringIOC容器配置功能
可以在ioc.xml中配置更多的属性值
bean标签知识点总结:
(1)id及class
<!--id:唯一标识符,自定义,在IOC测试中getbean()方法中,填写的标识符名称及其 实体类.class -->
<!--class:类的完全限定名,路径及其名称-->
<bean id="user" class="com.jyk.entity.User">
<!--name:为实体类属性 value:属性的值,相当于我们写实体类的.setName()方法 其他属性标签一样的方式-->
<!--scope:标签为此类时单例还是多例模式,单例的话,不能new对象,过程中使用的都是同一个对象,可以进行相应的测试,单例时容器创建的时候此对象就已经创建,而多例时什么时候需要对象什么时候进行创建,创建的都是新的对象 scope="singleton" 单例scope="prototype"多例-->
<property name="name" value="root" scope="singleton"><property>
</bean>
(2)属性scope标签测试
(1)单例模式测试结果
(2)多例模式测试结果
(3)属性init-method及destroy-method标签
init-method=""<!--初始化调用实体类的哪个方法-->
destroy-method=""<!--销毁对象调用实体类的哪个方法-->
(4)属性parent标签
父类对象是哪个类
<bean id="paruser" class="com.jyk.bean.ParUser">
<property name="age" value="17"></property>
</bean>
<bean id="user" class="com.jyk.bean.User" parent="paruser">
<property name="id" value="1" ></property>
<property name="name" value="root"></property>
<property name="password" value="root"></property>
<property name="address" value="北京市"></property>
</bean>
(5)属性abstract标签
此类是否是抽象类无法进行实例化
<bean id="user" class="com.jyk.bean.User" abstract="true">
</bean>
(6)factory-bean及 factory-method
facotry-method:调用静态工厂方法
public class StaticFactory {
private static User getInstance(String name){
User user = new User();
user.setId(12);
user.setName(name);
user.setAddress("上海");
return user;
}
}
<bean id="factory" class="com.jyk.bean.StaticFactory" factory-method="getInstance">
<constructor-arg value="zhangsan"></constructor-arg>
</bean>
public class Testdemo {
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("ioc.xml");
User user = applicationContext.getBean("factory", User.class);
System.out.println(user);
}
}
factrory-bean具体工厂的实例:
实例工厂
public class InstanceFactory {
private User getInstance(String name){
User user = new User();
user.setId(12);
user.setName(name);
user.setAddress("上海");
return user;
}
}
xml配置
<bean id="instancefactory" class="com.jyk.bean.InstanceFactory"></bean>
<bean id="userinstance" class="com.jyk.bean.User" factory-bean="instancefactory" factory-method="getInstance">
<constructor-arg value="lisi"></constructor-arg>
</bean>
测试结果:
public class Testdemo {
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("ioc.xml");
User user = applicationContext.getBean("userinstance", User.class);
System.out.println(user);
}
}
(7)autowire装配类型
自动装配类型包括
no:不装配
byName:按照id来自动装配
byType:按照类型自动装配,多个类型会报错
default:不装配
constructor:按照构造器及逆行装配
测试:
no/default:效果一样
byName:按照名字注入
byType:按照类型自动注入,但是有多个类型的时候会报错
constructor:构造器进行注入,将add属性值在实体类方法生成构造方法后,然后配置xml文件
加载properties文件
<context:property-placeholder location="classpath:db.properties"></context:property-placeholder>
bean标签加载druid数据库:
maven依赖:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.23</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.20</version>
</dependency>
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"></property>
<!--数据库端口,时区需要注意,mysql版本不同,需要添加额外的参数,可以将value信息放到.propertes文件中然后通过加载属性文件,在此标签中使用-->
<property name="url" value="jdbc:mysql://localhost:3307/demo?serverTimezone=UTC"></property>
<property name="username" value="root"></property>
<property name="password" value="root"></property>
</bean>
测试结果:
总结
xml配置方式比较繁琐,但是相对比较全面实现功能更加强大,而注解实现方式更加简单,在此过程中遇到的问题有
(1)数据库连接池,连接不上,driverClassName及url书写注意,尤其url需要根据数据库版本设置时区为UTC
(2)自动装配,按照构造器进行装配,需要在实体类定义装配类的构造方法,否则为null
(3)单例和多例创建时间,单例是容器初始化创建,自始至终都是一个相同的对象,多例是使用实例化对象的时候创建,而且重新创建一个对象