Spring的形成,最初来自Rod Jahnson所著的一本很有影响力的书籍《Expert One-on-One J2EE Design and Development》,就是在这本书中第一次出现了Spring的一些核心思想,该书出版于2002年。另外一本书《Expert One-on-One J2EE Development without EJB》,更进一步阐述了在不使用EJB开发JAVA EE企业级应用的一些设计思想和具体的做法。
Spring遵循的一个宗旨:一切皆为Bean 。
你可以把 Spring 比作一个 “超级工厂” 里面任何Bean 都可以生产。当然里面的IOC容器 是这个超级工厂的 “核心”
所有从Bean都出自这里,我们只要给了 这个工厂 的 “生产说明” 或者说是 “生产清单”
(applicationContext.xml),IOC容器就可以生产处我们想要的 Bean。所谓的AOP(面向切面编程)你可以理解为
“横插一杠”,因为 这里的 Bean 是 IOC 容器生产的,所以IOC在生产它的时候可以改变它的行为,比如 一个 Bean A要做
发送邮件这个行为,但是我在 “生产说明” 中规定 这个Bean 在做发送邮件这个行为之前,还有一个Bean
L要做记录日志行为,所以当这个Bean要发送邮件的时候,先让L
记录日志,然后才是B发送邮件。其实AOP就是在原有的执行顺序中切入一个新的行为。
Spring的核心理念:依赖注入和面向切面,即DI和AOP,依赖注入也叫控制反转。
二、hellospring写一个hellospring的小例子
要先导入依赖:
org.springframework
spring-webmvc
5.2.0.RELEASE
先创建一个实体类
package com.zhoudan;
public class Hello {
String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void test(){
System.out.println(name);
}
@Override
public String toString() {
return "Hello{" +
"name='" + name + '\'' +
'}';
}
}
创建配置文件beans.xml
id=对象名 class=是要实例化的的对象 property=对象属性设值
测试类
public class MyTest {
public static void main(String[] args) {
//获取spring的上下文对象 本质是利用set注入,所以必须有set方法
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
Hello h = (Hello) context.getBean("h");
h.test();
}
}
三、IOC创建对象的方式
分为以下四种方式:
建立User类为实验环境:
package com.zhoudan;
public class User {
private String name;
private int age;
public User(){
System.out.println("无参构造调用了");
}
public User(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
1、使用无参构造创建对象
利用set方式注入的方式
2、使用有参构造创建对象:此时要把无参构造器注释掉
a、利用下标赋值
b、类型赋值
c、利用参数名赋值
注意spring容器就像是一个婚姻介绍所,如果再建立一个u5
就算在测试类中没有获得u5的对象,也会自动初始化,打印出无参构造调用了
测试类:
ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
User u4 = context.getBean("u4", User.class);//此处已经将U4对象的类型指定了
System.out.println(u4);
四、Spring配置
1、别名 alias
2、bean 的属性
id是唯一标识符
class:bean对象对应的权限命名
name 别名 可以取多个
scope 作用域
3、import
可以将对个配置文件导入合成一个
4、scope
prototyle:每次创建一个新对象
singleton:容器只有一个对象(默认)
request/session:web中
当设置为单例模式时:
public void test(){
ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
Hello h1= context.getBean("h", Hello.class);
Hello h2 = context.getBean("h", Hello.class);
System.out.println(h1.hashCode());
System.out.println(h2.hashCode());
}
取到的对象始终是同一个!!
当设置为原型模式时:
五、set注入–属性注入
建立一个people类和一个Address类
public class People {
private String name;
private Address address;
private String[] books;
private List hobbys;
private Mapcard;
private Set games;
private Properties info;
private String wife;//空指针
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
public String[] getBooks() {
return books;
}
public void setBooks(String[] books) {
this.books = books;
}
public List getHobbys() {
return hobbys;
}
public void setHobbys(List hobbys) {
this.hobbys = hobbys;
}
public Map getCard() {
return card;
}
public void setCard(Map card) {
this.card = card;
}
public Set getGames() {
return games;
}
public void setGames(Set games) {
this.games = games;
}
public Properties getInfo() {
return info;
}
public void setInfo(Properties info) {
this.info = info;
}
public String getWife() {
return wife;
}
public void setWife(String wife) {
this.wife = wife;
}
@Override
public String toString() {
return "People{" +
"name='" + name + '\'' +
", address=" + address +
", books=" + Arrays.toString(books) +
", hobbys=" + hobbys +
", card=" + card +
", games=" + games +
", info=" + info +
", wife='" + wife + '\'' +
'}';
}
public class Address {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Address{" +
"name='" + name + '\'' +
'}';
}
}
西游
水浒传
唱歌
跳舞
LOL
吃鸡
201455110103
103
测试类
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
People xiaoming = context.getBean("xiaoming",People.class);
System.out.println(xiaoming);
六、c命名和p命名空间注入
p空间命名可以直接注入属性的值
等价于
c命名空间 等价于有参构造器命名方式
但是要注意引入约束:
xmlns:p="http://www.springframework.org/schema/p"
xmlns:c="http://www.springframework.org/schema/c"
七 、bean的作用域
原型模式
在测试类中:输出两个的hashCode,可以发现不一样
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext1.xml");
User user1 = context.getBean("user", User.class);
User user2 = context.getBean("user", User.class);
System.out.println(user1.hashCode());
System.out.println(user2.hashCode());
单例模式
输出两个的hashCode,可以发现一样
注意,默认为单例模式,保证唯一性!!!