spring(一)--概念和历史/hellospring/IOC创建对象的方式/Spring配置/set注入/c命名和p命名空间注入/bean的作用域

Alice ·
更新时间:2024-09-20
· 973 次阅读

文章目录一、概念和历史二、hellospring三、IOC创建对象的方式四、Spring配置五、set注入--属性注入六、c命名和p命名空间注入七 、bean的作用域 一、概念和历史

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,可以发现一样
注意,默认为单例模式,保证唯一性!!!


作者:天黑之前往前冲



spring set 对象 bean ioc 作用域

需要 登录 后方可回复, 如果你还没有账号请 注册新账号