1.基础知识
1.基础配置
添加依赖:
pom.xml:测试类,不包含mvc功能
1
2
3
4
5
6
7<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.9.RELEASE</version>
</dependency>
</dependencies>复制spring(applicationContext).xml文件
2.注意事项
接口—父类—子类
1
2
3
4
5
6
7
81.接口
ApplicationContext ac = new ClassPathXmlApplicationContext("Sping.xml文件名");//不能close
2.接口实现类(父类)
AbstractApplicationContext ac = new ClassPathXmlApplicationContext("Sping.xml文件名");
3.子类(原始)
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("Sping.xml文件名");第一个单词+简写(alt+/)
尽量使用方法不使用强转,而使用方法,因为方法可能会升级
运用反射的技术进行操作:反射无视访问权限
- 控制反转
- 控制反转:Spring获取已经创建好的对象;(可以创建对象,称为Spring控制对象,也称为IOC控制反转.)
- 主动控制:直接new对象;
2.Spring IOC容器
使用IOC实例化javaBean的流程
1.创建javaBean:实体类
创建步骤
- 必须在包(package)内创建
- 实现Serializable序列化接口(暗中添加三个方法)
- 书写无参构造器(如果有构造器的话)
- 可以是默认构造器
- 方便子类的继承
- 创建get/set/toString定义”Bean属性”;
java
1
2
3
4
5
6class User{
String Name;//实例变量:对象属性
public String getName(){}//Bean属性:name
public String setName(){}//Bean属性:name
toString();
}
2.实例化(创建javaBean对象)
让Spring框架在启动的时候自动创建DemoBean的实例,并绑定ID为demoBean
id与name功能一样
1.xml标签
Bean标签列表
代码 功能 注意事项 class javaBean文件所在位置 id javaBean被实例化时的名称 与name功能相同; name javaBean被实例化时的名称 与id功能相同; factory-method=”方法” 工厂方法初始化时执行方法 factory-bean=”Bean对象” 工厂方法初始化Bean创建对象 init-method 初始化方法 Spring会在容器启动时候,创建Bean对象,并且执行init()方法 destroy-method 销毁方法 Spring会在关闭容器时候,销毁Bean对象,并且执行destroy()方法/仅在单例时有效 scope=”prototype” 建立多个Bean实例,每次调用GetBean时候都会创建一个新对象 默认情况下,Spring中Bean是”单例”的(自始而终,singletion,并且创建的对象时同一对象) lazy-init=”true”; 懒惰初始化 适合很少使用的对象 单例的Java在容器启动时立即初始化,反应快,性能好,占用资源高.
懒惰初始化不是立即生效
alias标签:设置别名
1
<alias name="Bean名" alias ="别名" />//没有id选项只有name选项
2.Spring IOC创建对象三种方法
只能对spring.xml配置的文件进行实例化,不能实例化@server相关的
使用无参数构造器创建对象:
1
<bean id="demoBean" class="day01.DemoBean"></bean>
调用类的静态工厂方法创建对象:
1
<bean id="calender" class="java.util.Calendar" factory-method="getInstance"></bean>
调用对象的工厂方法创建对象:
调用了2中的Bean[不推荐]
1
<bean id="date" factory-bean="calender" factory-method="getTime"></bean>
直接书写
1
2
3<bean id="userServiceImpl" class="cn.tedu.service.UserServiceImpl"></bean>
//<constructor-arg type = "String" value = "key" />传递参数
<bean id="user" factory-bean="userServiceImpl" factory-method="findAll"/></bean>
3.调用
导入Spring配置文件(applicationContext文件,启动、初始化Spring容器)
1
AbstractApplicationContext ac = new ClassPathXmlApplicationContext("spring配置文件");
从xml中获取指定ID的对象
方法一[不推荐]:
1
ID名类型 id = (ID名类型)ctx.getBean("ID名");//默认输出project类型,强转成id名对应的类型
方法二:
1
ctx.getBean("ID名",ID名类型.class);
3.Spring注入
1.Set注入
1.注入属性的值
注意事项java:
- 无参构造器的优先级小于set注入的值
- public时可以直接User.name,或者用private然后get方法导出来
- 直接输出对象时输出的是toString方法
注意事项property:
XML文件中的property中name与java中setName()有关.set方法的参数名无关
java中的set方法名通常和属性名相同
java文件
1
2
3
4
5
6public class User {
public String name;
public void set+A变量名(String name) {
this.name = name;
}
}初始化变量(相当于在set方法传入)
1
2
3<Bean id="" class="">
<property name="a变量名" value="变量值"></property>
</Bean>
1.2注入非基本值
基础知识
如果某属性的值不是基本值(可以直接在代码中书写的值,例如数值、字符串),而是另一个
<bean>
时,需要使用ref
来确定该属性的值,例如:java
1
2
3
4public Department department;
public Department setDepartment() {
return department;
}xml
1
2
3
4
5
6<bean id="department" class="cn.tedu.spring.department">
<property name="x变量名" value="变量值"></property>
</bean>
<bean id="user" class="cn.tedu.spring.User">
<property name="department" ref="department" />
</bean>
2.通过有参构造方法注入属性的值[不常用]
注意事项:
通常情况下都不需要有参构造器,正常的类都需要无参构造器;
如果某个类没有无参数的构造方法,且参数可以用于属性赋值.
同理,如果构造方法的参数的类型不是基本值能表达的,则应该通过
ref
来注入值!index
是从0开始顺序编号的!
java文件
1
2
3
4
5
6
7public class Person {
public String name; // Mike
public Person(String name) {
super();
this.name = name;
}
}则在Spring的配置文件中:
1
2
3
4<bean id="person" class="cn.tedu.spring.Person">
<!-- index:为第几个参数注入值 -->
<constructor-arg index="0" value="Mike"></constructor-arg>
</bean>
3.自动装配非基本值:autowire[不常用]
注意事项:
不建议使用,容易出现错误
自动装配是Spring自动的为属性注入值的做法,也是基于SET注入方式实现的;
byName:根据set名称装配:
- 名称很容易保持一致
byType:根据属性类型装配:
- 1.没有匹配的对象不会自动配置也不会发生错误;
- 2.需要保证匹配类型的对象有且仅有1个
xml1
1
2<bean id="user" class="cn.tedu.spring.User" autowire="byName"></bean>
<bean id="user" class="cn.tedu.spring.department"></bean>xml2
1
2<bean id="user" class="cn.tedu.spring.User" autowire="byType"></bean>
<bean id="user" class="cn.tedu.spring.department"></bean>多对象错误
1
Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'cn.tedu.spring.UserDao' available: expected single matching bean but found 2: userDao,userDao2
4.注入集合类型
1.List/Set[仅了解]
注意事项
- set在spring中是:LinkedHashSet;
- list早spring中是:ArrayList;
java
1
2
3
4public List<String> names;
public void setNames(List<String> names) {
this.names = names;
}xml
1
2
3
4
5
6
7
8
9<bean id="" class="">
<property name="names">
<list>
<value>1</value>
<value>2</value>
<value>3</value>
</list>
</property>
</bean>
2.map[仅了解]
注意事项:LinkedHashMap
java
1
2
3
4public Map<String,Object> session;
public void setSession(Map<String,Object> session){
this.session = session;
}xml
1
2
3
4
5
6
7
8
9<bean id="" class="">
<property name="session">
<map>
<entry key="username" value="root" />
<entry key="password" value="ad" />
<entry key="age" value="18" />
</map>
</property>
</bean>
3.数组[仅了解]
注意事项:
数组的配置可以和list混为一谈(set/list/array标签可以互相使用)
java
1
2
3
4public String[] classes;
public void setClasses(String[] classes) {
this.classes = classes;
}xml
1
2
3
4
5<list><!--<array><set>-->
<value>JSD1811</value>
<value>JSD1812</value>
<value>JSD1901</value>
</list>test
1
2
3
4SampleBean sampleBean = ac.getBean("sampleBean", SampleBean.class);
System.out.println(sampleBean.classes.getClass());
//不能直接输出,直接输出输出的是类型
System.out.println(Arrays.toString(sampleBean.classes));
4.properties[掌握]
注意事项:
- properties存在的原因:相比较于xml可读性更高
- spring配置文件使用properties方法:
properties
1
2
3
4
5
6url=jdbc:mysql://localhost:3306/db_name?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
driver=com.mysql.jdbc.Driver
username=root
password=root
initialSize=2
maxActive=10java
1
2
3
4public Properties dbConfig;
public void setDbConfig(Properties dbConfig) {
this.dbConfig = dbConfig;
}xml
方法1[不推荐]:
1
2
3
4
5
6
7
8<bean id="" class="">
<property name="dbConfig">
<props>
<prop key="driver">com.mysql.jdbc.Driver</prop>
...
</props>
</property>
</bean>方法2:
- <util>相当于bean
- 还可以用<util>配置其他的集合
1
2
3
4<bean id="" class="">
<property name="dbConfig" ref="db" />
</bean>
<util:properties id="db" location="classpath:db.properties"></util:properties>
2.Spring表达式
用于获取非基本值
获取非基本值(取代ref)
#{bean_id.属性名}
1
2
3<bean id="" class="">
<property name="username" value="#{user.name}"></property>
</bean>获取List/Set集合[不推荐]
#{bean_id.集合属性名[索引值]}
- 注意事项
- []内的是索引,并不是数组,因此在大多数情况下不建议使用;
- set不能使用:因为他没有索引(但是Spring中linkedHashSet可以)
1
2
3<bean id="" class="">
<property name="username" value="#{sampleBean.names[1]}"></property>
</bean>- 注意事项
获取Map集合
1.#{bean_id.map属性名.key}
2.#{bean_id.map属性名[‘key’]}
推荐第一个因为可以少写代码
1
2
3<bean id="" class="">
<property name="password" value="#{sampleBean.session.password}"></property>
</bean>
3.注解注入
- 扫描注解
- 在Spring加载时执行只会影响启动速度,但是并不会影响使用
1.componet注解:
原理:
Spring会扫描包名内所有的class,如果配置了Component注解就会创建对象(包名>=注解所在包)
分类
以下注解的功能是完全等效的,但是应该区分使用:
注解 名称 @Component 通用注解 @Controller 控制类注解 @Service 业务类注解 @Repository 持久层类 配置
xml
@Controller注解扫描
1
<context:component-scan base-package="包名" />
- java
- 使用默认Bean-id(类名首字母变小写,与之前相同)
1
2
3
public class 类名{
}自定义Bean-id[不常用]
1
2
3"id名") (
public class 类名{
}
2.其他注解[不常用]
多例
1
"prototype")//多例 (
懒加载
1
2
true) (单例[不推荐]
3.2非懒加载(默认)
初始化时立即生效
java
1
2
3
4
5
6
7
8
9
10
11public class King {
private static King king = new King();
//2.因为要返回同一个对象,因此不能直接返回new对象;
private King() {}
//1.将构造方法私有化,这样不能在外界new对象
public static King getInstance() {
//3.设置成static,可以不创建对象直接调用方法
//4.static执行级别高,因此提前加载进内存,而这里返回的King对象没有加载进去,因此这个King也要设置成static;static一直在内存中,因此取决于使用频率;
return king;
}
}单例注解
1
2"singleton")//默认单例无需添加 (
//单例非懒加载
1
false) (
3.2 懒加载
初始化时不生效,使用时启动(但是初始化一次)
java
1
2
3
4
5
6
7
8
9
10
11
12
13public class King {
private static King king = null;
private King() {}
public static King getInstance() {
if(king==null){//判断是否需要锁
sychronized("java"){//线程安全问题,两个线程同时进入可能会创建多个对象
if(king==null){//判断是否创建对象
king = new King();
}
}
return king;
}
}
生命周期
在使用这2个注解之前,需要添加Tomcat运行环境,否则这2个注解将无法识别。tomcat负责这两个操作,但是可以在junit中使用
1
2初始化
结束时自动装配非基本属性
注意事项:
写在需要自动装配的属性上面,不写在类上面;
先根据byName(set)如果失败再根据byType
方法1:
1
2
3
4public class abc(){
public efgh efg;
}方法2:
注意:
@Resource
是javax
包中的,如果使用该注解,需要项目添加Tomcat环境。1
2
3
4public class abc(){
"efgh") (name=
public efgh efg;
}
最后更新: 2019年11月06日 11:36
原始链接: https://airbash.cn/2019/11/02/Spring/Spring%E5%9F%BA%E7%A1%80/