Spring入门 IOC理论,第一个spring程序Di依赖注入,Bean的自动装配
简介
spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅仅限于服务器端的开发。从简单性、可测试性和松耦合性角度而言,绝大部分Java应用都可以从Spring中受益。
Spring的组成
-
Spring Core 核心容器
核心容器提供Spring框架的基本功能,Spring以bean的方式组织和管理java应用的各个组件和关系
使用BeanFactory来产生和管理Bean
-
SpringContext 应用上下文 一个配置文件,向Spring框架提供上下文信息
-
Spring Aop 面向切面编程
-
Spring Dao 数据库连接模块
-
Spring ORM 对象实体映射
-
Spring Web web应用程序模块
-
Spring Web mvc mvc模块
IOC理论推导
传统开发
- UserDao接口
- UserDaoImpl实现类
- UserService 业务接口
- UserServiceImpl 业务实现类接口
但用户的需求可能会影响我们原来的代码,我们需要根据用户的需求去修改源代码,如果代码量非常大,修改的位置很多
IOC原型
可以用Set进行动态实现值的注入
private UserDao userDao;
public void setUserDao(UserDao userDao){
this.userDao=userDao;
}
//在业务层调用的时候修改传进的对象,来获取对应的实现类
//动态实现值的注入,用户选择业务的对象
//设计者不用去管理对象的创建,降低了系统的耦合性
IOC本质
将对象的创建转移给第三方,获得依赖对象的方式反转了
Spring创造IOC的方式
-
默认使用无参构造器创建对象
若使用有参构造器创建对象
可使用构造器参数实现
-
使用Set方法注入参数
构造器参数实现
<constructor-arg type="java.lang.String" value="32"/>
<constructor-arg index="0" value="33"/> <!--下标默认从0开始-->
<constructor-arg name="name" value="34"/> 直接通过参数名设置
配置环境
导入依赖
<dependencies>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.8.RELEASE</version>
</dependency>
</dependencies>
HelloSpring
实体类
public class Hello {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Hello{" +
"name='" + name + '\'' +
'}';
}
}
bean配置文件
- id:bean的唯一标识符
- class:bean对象所对应的类型
- name:bean的别名
<bean id="hello2" class="Hello">
<!--放置这个bean的协作者和配置-->
<!--
Hello hello = new Hello();
id = 变量名
class = new 的对象
<property name="name" value="Spring"/> 相当于给对象属性设值
-->
<property name="name" value="Spring"/>
</bean>
测试类
@Test
public void test1(){
//获取Spring上下文对象
ApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("application.xml");
//获取bean
Hello hello2 = (Hello) classPathXmlApplicationContext.getBean("hello2");
System.out.println(hello2.getName());
}
Hello对象是由Spring创建的,由Spring容器设置属性
本质上用Set方法注入
ApplicationContext产生流程
DI依赖注入
依赖:bean对象的创建依赖于容器
注入:bean对象的属性依赖于容器注入
Set方法注入
复杂类型注入
private String name;
private Address address;
private String[] books;
private List<String> hobbies;
private Map<String,String> card;
private Set<String> games;
private String wife;
private Properties info;
<bean id="address" class="com.lyc.pojo.Address">
<property name="address" value="Guangdong"/>
</bean>
<bean id="student" class="com.lyc.pojo.Student">
<!--普通值注入-->
<property name="name" value="lyc"/>
<!--对象类型注入-->
<property name="address" ref="address"/>
<!--数组类型注入-->
<property name="books">
<array>
<value>西厢记</value>
<value>金瓶梅</value>
</array>
</property>
<!--List类型注入-->
<property name="hobbies">
<list>
<value>听歌</value>
<value>看电影</value>
</list>
</property>
<!--Map类型注入-->
<property name="card">
<map>
<entry key="银行卡" value="3306"/>
<entry key="校园卡" value="3308"/>
</map>
</property>
<!--set类型注入-->
<property name="games">
<set>
<value>123</value>
<value>456</value>
</set>
</property>
<!--property注入-->
<property name="info">
<props>
<prop key="学号">23232</prop>
</props>
</property>
<!--空指针注入-->
<property name="wife">
<null/>
</property>
</bean>
Bean的作用域
singleton 单例模式,默认
<bean id="accountService" class="com.foo.DefaultAccountService" scope="singleton"/>
原型模式,每一次使用都创建一个对象
<bean id="accountService" class="com.foo.DefaultAccountService" scope="prototype"/>
Bean自动装配
Byname自动装配
spring容器会自动寻找set方法对应的beanid,会自动在容器上下文中查找,和自己对象set方法后面的值对应的beanid,要保证id唯一
<bean id="cat" class="com.lyc.pojo.Cat"/>
<bean id="dog" class="com.lyc.pojo.Dog"/>
<bean id="people" class="com.lyc.pojo.People" autowire="byName">
<property name="name" value="lyc"/>
</bean>
Bytype
spring容器会自动寻找类型对应的beanid,会自动在容器上下文中查找,要保证类型唯一
<bean id="cat" class="com.lyc.pojo.Cat"/>
<bean id="dog" class="com.lyc.pojo.Dog"/>
<bean id="people" class="com.lyc.pojo.People" autowire="byType">
<property name="name" value="lyc"/>
</bean>
注解实现自动装配
配置注解的支持
<?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:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:annotation-config/>
</beans>
@autowired
可以在set方法,也可以在属性上使用,默认为byType,byType找不到在Byname
@Autowired //实现属性的自动装配
private Cat cat;
@Autowired
@Qualifier(value="dog222") //指定名字
private Dog dog;
@Nullable 这个字段可以为null
@Autowired(required = false)这个对象可以为null
ext.xsd">
<context:annotation-config/>
```
@autowired
可以在set方法,也可以在属性上使用,默认为byType,byType找不到在Byname
@Autowired //实现属性的自动装配
private Cat cat;
@Autowired
@Qualifier(value="dog222") //指定名字
private Dog dog;
@Nullable 这个字段可以为null
@Autowired(required = false)这个对象可以为null
上一篇: oifcfg命令详解(原创)
下一篇: OO原则的一些想法