Spring
- 一、文档
- 二、依赖注入方式
- 三、注入其他类型
- 3.1 设置null空值:使用null标签
- 3.2 含特殊字符:使用CDATA
- 四、注入外部bean、内部bean
- 4.1 注入属性中的外部bean
- 4.2 注入属性中的内部bean
- 4.3 注入属性级联赋值
- 五、注入集合属性
- 5.1 注入集合属性
- 5.2 把集合注入部分提取出来
- 六、工厂bean
- 七、bean作用域:scope参数
- 7.1 标准作用域
- 7.2 Web 相关作用域
- 八、bean生命周期
- 九、自动装配
- 9.1 autowire属性(很少用)
- 十、注解
- 10.1 Spring针对bean管理中创建对象提供注解有:@Service、@Controller、@Component、@Repository
- 10.2
一、文档
spring官网
二、依赖注入方式
1、使用set方法实现注入(bean中使用property
)
2、使用有参构造实现注入(bean中使用constructor-arg
)
<?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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><!--1、完成User对象的创建bean标签:id属性:Bean的唯一标识符class属性:要创建对象所在类的全路径(包名称+类名称)--><bean id="user" class="org.example.User"><!--使用property标签完成属性注入:name:类里面属性名称,value:给属性赋值--><property name="name" value="John Doe" /><property name="age" value="30" /></bean><!--2 有参数构造注入属性--><bean id="orders" class="org.example.Orders"><constructor-arg name="oname" value="电脑" /><constructor-arg name="address" value="China" /></bean></beans>
orders类:
package org.example;public class Orders {private String oname;private String address;//有参数构造方法public Orders(String oname, String address) {this.oname = oname;this.address = address;}public void testDemo() {System.out.println("orders:=======" + oname + "======" + address);}
}
user类:
package org.example;public class User {private String name;private Integer age;// 使用set方法实现注入public void setName(String name) {this.name = name;}public void setAge(Integer age) {this.age = age;}public void testDemo() {System.out.println("user:=======" + name + "======" + age);}
}
测试代码:
package org.example;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class Testdemo {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");User user = context.getBean("user", User.class);System.out.println("hello :" + user);user.testDemo();Orders orders = context.getBean("orders", Orders.class);System.out.println("hello :" + orders);orders.testDemo();}
}
三、注入其他类型
3.1 设置null空值:使用null标签
<!--使用null标签:表示注入空值--><property name="age"><null/></property>
3.2 含特殊字符:使用CDATA
<constructor-arg name="address"><value><![CDATA[<<南京>>]]></value></constructor-arg>
结果:
四、注入外部bean、内部bean
4.1 注入属性中的外部bean
<!--4 service和dao对象创建--><bean id="userService" class="service.UserService"><!--注入userDaoImpl对象 name:类里面属性名称,ref:创建userDao对象bean标签id值--><property name="userDao" ref="userDaoImpl"/></bean><bean id="userDaoImpl" class="dao.UserDaoImpl"></bean>
UserService:
package service;import dao.UserDao;public class UserService {private UserDao userDao;public void setUserDao(UserDao userDao) {this.userDao = userDao;}public void add() {System.out.println("service add...");userDao.add();}
}
dao先定义接口:
package dao;public interface UserDao {public void add();
}
实现dao:
package dao;import org.example.User;public class UserDaoImpl implements UserDao {@Overridepublic void add() {System.out.println("UserDaoImpl add...");}
}
测试代码:
package dao;import org.example.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import service.UserService;public class Testdemo {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");UserService userService = context.getBean("userService", UserService.class);System.out.println("hello :" + userService);userService.add();}
}
运行结果:
4.2 注入属性中的内部bean
<!--内部bean--><bean id="emp" class="bean.Emp"><property name="ename" value="tom"></property><property name="gender" value="女"></property><!-- 设置对象类型属性 (内部 bean 不需要指定 id 属性,因为它是内部使用)--><property name="dept"><bean class="bean.Dept"><property name="dname" value="研发部"></property></bean></property></bean>
Dept:
package bean;public class Dept {private String dname;public void setDname(String dname) {this.dname = dname;}public String getDname() {return dname;}@Overridepublic String toString() {return super.toString();}
}
Emp:
package bean;public class Emp {private String ename;private String gender;//员工属于某一部门,使用对象形式表示private Dept dept;public void setEname(String ename) {this.ename = ename;}public void setGender(String gender) {this.gender = gender;}public void setDept(Dept dept) {this.dept = dept;}public void show(){System.out.println("员工姓名:"+ename+",性别:"+gender+",部门:"+dept.getDname());}
}
运行结果:
4.3 注入属性级联赋值
<!--级联赋值--><bean id="emp" class="bean.Emp"><property name="ename" value="tom"></property><property name="gender" value="女"></property><!-- 级联赋值--><property name="dept" ref="dept"></property></bean><bean id="dept" class="bean.Dept"><property name="dname" value="财务部"></property></bean>
其他同4.2,运行结果如下:
五、注入集合属性
5.1 注入集合属性
<!--集合属性--><bean id="stu" class="collectType.Student"><property name="coureses"><array><value>java课程</value><value>数据库课程</value></array></property><property name="list"><list><value>张三</value><value>李四</value></list></property><property name="set"><set><value>张三</value><value>李四</value></set></property><property name="map"><map><entry key="1" value="java"></entry><entry key="2" value="数据库"></entry></map></property><!--注入list集合类型,值是对象--><property name="courseList"><list><ref bean="course1"></ref><ref bean="course2"></ref></list></property></bean><!--创建多个course对象--><bean id="course1" class="collectType.Course"><property name="cname" value="spring课程"></property></bean><bean id="course2" class="collectType.Course"><property name="cname" value="springboot课程"></property></bean>
course:
package collectType;public class Course {private String cname;public void setCname(String cname) {this.cname = cname;}@Overridepublic String toString() {return "Course{" +"cname='" + cname + '\'' +'}';}
}
Student:
package collectType;import java.util.Arrays;
import java.util.Map;
import java.util.Set;
import java.util.List;public class Student {// 数组类型属性private String[] coureses;private List<String> list;private List<Course> courseList;private Set<String> set;private Map<String, String> map;public void setList(List<String> list) {this.list = list;}public void setSet(Set<String> set) {this.set = set;}public void setMap(Map<String, String> map) {this.map = map;}public void setCoureses(String[] coureses) {this.coureses = coureses;}public void setCourseList(List<Course> courseList) {this.courseList = courseList;}public void show() {System.out.println(Arrays.toString(coureses));System.out.println(list);System.out.println(set);System.out.println(map);System.out.println(courseList);}
}
运行结果:
5.2 把集合注入部分提取出来
(1)xmlns:util空间,注意是http
(2)util:list
(3)ref中使用util:list标签的id名
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:util="http://www.springframework.org/schema/util"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/utilhttp://www.springframework.org/schema/util/spring-util.xsd"><!--1、提取list集合类型属性注入--><util:list id="bookList"><value>活着</value><value>在人间</value><value>我与地坛</value></util:list><!--2、提取list集合类型属性注入--><bean id="book" class="collectType.Books"><property name="list" ref="bookList"></property></bean>
</beans>
book:
package collectType;import java.util.List;public class Books {private List<String> list;public void setList(List<String> list) {this.list = list;}public void show(){System.out.println(list);}
}
六、工厂bean
<bean id="myBean" class="collectType.MyBean"></bean>
工厂bean:不直接返回自身实例,而是通过getObject()方法返回另一个对象
package collectType;import org.springframework.beans.factory.FactoryBean;public class MyBean implements FactoryBean<Course> {@Overridepublic Course getObject() throws Exception {//Course course = new Course();course.setCname("java");return course;}@Overridepublic Class<?> getObjectType() {return null;}@Overridepublic boolean isSingleton() {return FactoryBean.super.isSingleton();}
}
运行结果:
七、bean作用域:scope参数
<bean id="user" class="org.example.User" scope="prototype"> </bean>
7.1 标准作用域
1、Singleton (单例作用域)
- 默认作用域
- 每个 Spring IoC 容器中只存在一个 Bean 实例
- 所有请求都返回同一个实例
- 适用于无状态 Bean
2、Prototype (原型作用域)
- 每次请求都创建一个新的 Bean 实例
- 适用于有状态的 Bean
- Spring 不管理原型 Bean 的完整生命周期
7.2 Web 相关作用域
3、Request (请求作用域)
- 每个 HTTP 请求创建一个新的 Bean 实例
- 仅在 Web 应用中可用
4、Session (会话作用域)
- 每个 HTTP Session 创建一个 Bean 实例
- 用户会话期间保持相同实例
- 仅在 Web 应用中可用
5、Application (应用作用域)
- 每个 ServletContext 创建一个 Bean 实例
- 类似于单例,但在 Servlet 容器中每个应用有一个实例
- 仅在 Web 应用中可用
6、WebSocket (WebSocket 作用域)
- 每个 WebSocket 会话创建一个 Bean 实例
- 在 WebSocket 会话期间保持相同实例
八、bean生命周期
Spring Bean 的生命周期指的是从 Bean 的创建到销毁的整个过程。
init-method和destroy-method
<bean id="user" class="org.example.User" init-method="init" destroy-method="destroy"><!--使用property标签完成属性注入:name:类里面属性名称,value:给属性赋值--><property name="name" value="John Doe" />
<!-- <property name="age" value="30" />--><!--null标签:表示注入空值--><property name="age"><null/></property></bean>
user类:
package org.example;public class User {private String name;private Integer age;public User() {System.out.println("第一步:user无参构造");}// 使用set方法实现注入public void setName(String name) {this.name = name;System.out.println("第二步:调用set方法设置属性值" + name);}public void setAge(Integer age) {this.age = age;System.out.println("第二步:调用set方法设置属性值" + age);}public void init(){System.out.println("第三步:初始化bean");}public void destroy(){System.out.println("第五步:销毁bean");}public void testDemo() {System.out.println("user:=======" + name + "======" + age);}
}
测试:
package org.example;import dao.UserDaoImpl;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class Testdemo {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");User user = context.getBean("user", User.class);System.out.println("第四步:获取创建的bean实例对象 :" + user);// 手动让bean实例销毁((ClassPathXmlApplicationContext) context).close();}
}
运行结果:
九、自动装配
9.1 autowire属性(很少用)
<!--实现自动装配:bean标签属性autowire,配置自动装配byName 根据属性名称注入,注入的bean的id值需和类的属性名称一样byType 根据属性类型注入,得保证类型唯一--><bean id="emp" class="bean.Emp" autowire="byName"><property name="ename" value="tom"></property><property name="gender" value="男"></property></bean><bean id="dept" class="bean.Dept"><property name="dname" value="测试部"></property></bean>
十、注解
注解可用于类、方法、属性
10.1 Spring针对bean管理中创建对象提供注解有:@Service、@Controller、@Component、@Repository
<!--开启组件扫描1、如果扫描多个包,多个包使用逗号隔开或扫描包上层目录-->
<context:component-scan base-package="demo"></context:component-scan>
在注解里面value属性值可以省略不写,默认值是类名首字母小写。
package demo;import org.springframework.stereotype.Service;@Service(value = "userService")
public class UserService {public void add(){System.out.println("test 123...");}
}
扫描demo包下不使用@Controller注解的类
<context:component-scan base-package="demo"><!--排除组件--><context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/></context:component-scan>
扫描demo包下使用@Service注解的类
<context:component-scan base-package="demo" use-default-filters="false"><!--包含组件--><context:include-filter type="annotation" expression="org.springframework.stereotype.Service"/></context:component-scan>