1、Spring——第一天
- spring 是一个开源的免费空间
- spring是一个轻量级、非入侵式的框架
- 控制翻转(IOC)、面向切面编程(AOP)
- 支持事务的处理,对框架的整合
spring是一个轻量级的控制翻转和面向切面编程的框架
1.2 原来方式
- UserDao接口–UserDaoImpl实现类
- UserService业务接口-UserServicempl业务实现类
- 用户实际调用的是service层,service层调用dao层
如果在dao层增加了新的方法,又想在service调用该方法,则需在service层改变代码–新建实现类
因为你在代码里面写死了,新增加一个需求,就要改一个代码,牵一发动全身
private UserDao dao=new UserDaoImpl();
private UserDao dao1=new UserDaoMySqlImpl();
public void getUser() {
dao.getUser();
dao1.getUser();
}
1.3spring方式
利用set进行动态的实现注入
private UserDao dao;
public void setDao(UserDao dao) {
this.dao = dao;
}
异常:class path resource [beans.xml] cannot be opened because it does not exist
路径错误 换相对路径即可 来自源根的路径
**我们不需要再在程序中更改,要实现不同的操作,只需要在xml配置文件修改 **
IOC:对象由Spring创建,管理,装配!
- 反转:程序本身不创建对象,而变成被动的接收对象
- 控制:之前是程序控制创建对象,现在用spring,由spring控制
- 依赖注入:利用set方法进行注入的(对象,成员变量)
<?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/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="daoImpl" class="IOC.com.xiaocong.dao.UserDaoImpl"></bean>
<bean id="mysqlImpl" class="IOC.com.xiaocong.dao.UserDaoMySqlImpl"></bean>
<bean id="UserServiceImpl" class="IOC.com.xiaocong.service.UserServiceImpl">
<property name="dao" ref="mysqlImpl"></property>
</bean>
</beans>
测试:
@Test
public void test1(){
ApplicationContext Context= new ClassPathXmlApplicationContext("IOC\\com\\beans.xml");
UserServiceImpl userServiceImpl = (UserServiceImpl) Context.getBean("UserServiceImpl");
userServiceImpl.getUser();
}
1.4 IOC创建对象方式
- 使用无参构造方法创建对象——默认
- 使用有参构造方法创建对象——注入属性
<bean id="user" class="xiaocong.User">
<constructor-arg name="name" value="李四"></constructor-arg>
<constructor-arg name="age" value="12"></constructor-arg>
</bean>
<bean id="userT" class="xiaocong.UserT"></bean>
在配置文件加载时候,spring容器管理的对象就已经初始化了
spring会创建所有的对象(默认调用无参构造方法)
1.5 依赖注入
-
set注入要求Bean提供一个默认的构造函数,并为需要注入的属性提供对应的Setter方法。 -
Spring先调用Bean的默认构造函数实例化Bean对象,然后通过反射的方式调用Setter方法注入属性值。 -
假设Bean显示定义了一个带参的构造函数,则需要同时提供一个默认无参的构造函数,否则使用属性注入时将抛出异常。
<bean id="student" class="xiaocong.Students">
<property name="name" value="张三"></property>
<property name="address" ref="address"></property>
<property name="books">
<array>
<value>围城</value>
<value>白夜行</value>
</array>
</property>
<property name="hobbys">
<list>
<value>敲代码</value>
<value>睡觉</value>
</list>
</property>
<property name="card">
<map>
<entry key="身份证" value="000011"></entry>
<entry key="手机号" value="1110"></entry>
</map>
</property>
<property name="games">
<set>
<value>王者农药</value>
<value>英雄联盟</value>
</set>
</property>
<property name="wife" value=""></property>
<property name="info">
<props>
<prop key="学号">0001</prop>
<prop key="pwd">0001</prop>
</props>
</property>
</bean>
<bean id="address" class="xiaocong.Address">
<property name="address" value="江西"></property>
</bean>
private String name;
private Address address;
private String[] books;
private List<String> hobbys;
private Map<String,String> card;
private Set<String> games;
private Properties info;
private String wife;
@Override
public String toString() {
return "Students{" +
"name='" + name + '\'' +
", address=" + address.toString() +
", books=" + Arrays.toString(books) +
", hobbys=" + hobbys +
", card=" + card +
", games=" + games +
", info=" + info +
", wife='" + wife + '\'' +
'}';
}
@Test
public void test2(){
ApplicationContext context=new ClassPathXmlApplicationContext("bean.xml");
Students student = (Students) context.getBean("student");
System.out.println(student.toString());
}
|