标签:
轻量级,无侵入
Bean管理
1 创建applicationContext.xml
2 配置被管理的Bean
3 获取Bean
pom.xml配置
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>3.2.12.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>3.2.12.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>3.2.12.RELEASE</version> </dependency>
1 创建applicationContext.xml
<!-- 打开jar包,docs,spring-framework-reference,html,index,打开后有一行 点击 这一行 D. XML Schema-based configuration --> <?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"> </beans>
2 配置被管理的Bean
比如我们需要对某个dao进行操作,这个dao中有一些方法
public class UserDao{
public UserDao() {}
public void save() {}
public void init() {}
public void destroy() {}
}
<!-- 把类交给spring管理,用bean节点 ,class是受管理的完全限定名, id,也可以用name(name就可以取多个名字) <bean name="userDao,myDao" class="com.kaishengit.dao.UserDao"></bean> 如果用id表示,还想给他赋name属性 <bean id="userDao" class="com.kaishengit.dao.UserDao"/> <alias name="userDao" alias="myDao"/> name处放id的值 --> <bean id="userDao" class="com.kaishengit.dao.UserDao"></bean>
3 获取Bean
public class Test { public static void main(String[] args) { //读取applicationContext.xml配置文件 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); /*以前创建对象是new,现在交给spring后,就是用getBean,userDao是配置中id的名字*/ UserDao dao = (UserDao) context.getBean("userDao"); dao.save(); } }
表现其 无侵入性
只需要在UserDao中有定义这两个方法init ,destroy,就能在初始化时候执行init,销毁时执行--
destroy,而且在UserDao中没有导入什么什么包的
<bean id="userDao" class="com.kaishengit.dao.UserDao" init-method="init" destroy-method="destroy"/>
------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------
交给spring的类,默认都是单例模式
/* 在容器启动的时候 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); 就会读取这个文件,并且创建所有交给spring处理的类 */ ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); UserDao dao = (UserDao) context.getBean("userDao"); /*所以在getBean的时候就不会创建对象,即使是 UserDao dao = (UserDao) context.getBean("userDao"); UserDao dao2 = (UserDao) context.getBean("userDao"); 也只是执行一次构造方法,可以看出,这是单例模式*/
那么如何改变这种单例模式? 比如在action的时候,每次请求都要到达一个action--
这个是不能单例的
Bean scopes
1 singleton(默认)
<bean id="userDao" class="com.kaishengit.dao.UserDao" scope="singleton"></bean>
2 prototype
<bean id="userDao" class="com.kaishengit.dao.UserDao" scope="prototype"></bean>
/* 这时候在执行 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); 的时候就不会创建所有交给spring的类,而是在getbean的时候去创建 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); UserDao dao = (UserDao) context.getBean("userDao"); UserDao dao2 = (UserDao) context.getBean("userDao"); 就真的会执行两次构造方法,创建两个对象*/
-----------------------------------------------------------------------------------
-----------------------------------------------------------------------------------
Bean的延迟加载
<bean id="userDao" class="com.kaishengit.dao.UserDao" lazy-init="true"></bean>
/* 这时候在执行 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); 的时候就不会创建所有交给spring的类,而是在第一次使用getbean的时候去创建 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); UserDao dao = (UserDao) context.getBean("userDao"); UserDao dao2 = (UserDao) context.getBean("userDao"); 但是还是只执行一次构造方法*/
------------------------------------------------------------------------
------------------------------------------------------------------------
------------------------------------------------------------------------
IOC DI
1. ICO 控制翻转
2. DI 依赖注入
注入的两种方式
1 set注入
2 构造方法注入
UserService依赖UserDao 以前是:
public class UserService { private UserDao userDao = new UserDao(); public void save() { userDao.save(); } }
那么就不用new,选择set注入
public class UserService { private UserDao userDao; public void save(){ System.out.println("1111"); } //生成set方法 public void setUserDao(UserDao userDao) { this.userDao = userDao; } }
需要配置
<bean id="userDao" class="com.kaishengit.dao.UserDao"/> <bean id="userService" class="com.kaishengit.service.UserService"> <!-- name="userDao"是被注入类的属性名字 ,,是setUserDao的set后面的名字 ref="userDao"的这个userDao要和上面的id名字一致 --> <property name="userDao" ref="userDao"/> </bean> <!-- 或者是这种形式 --> <bean id="userDao" class="com.kaishengit.dao.UserDao"/> <bean id="userService" class="com.kaishengit.service.UserService"> <!-- userDao是被注入类的属性名字 ,,是setUserDao的set后面的名字--> <property name="userDao"> <!-- ref="userDao"的这个userDao要和上面的id名字一致 --> <ref bean="userDao"/> </property> </bean> <!-- 再或者是这种形式 --> <bean id="userDao" class="com.kaishengit.dao.UserDao"/> <bean id="userService" class="com.kaishengit.service.UserService"> <property name="userDao"> <bean class="com.kaishengit.dao.UserDao"/> </property> </bean>
------------------------------------------------------------------------
------------------------------------------------------------------------
其他set注入
public class BookService { private int age; private String name; private List<String> address; private Set<String> depts; private Map<String, String> maps; // 本身也是一个map结构 private Properties prop; public void show() { System.out.println("age:" + age); System.out.println("name:" + name); System.out.println("--------List---------"); for(String str : address) { System.out.println(str); } System.out.println("--------Set----------"); for (String str : depts) { System.out.println(str); } System.out.println("--------Map----------"); for(Entry<String, String> entry : maps.entrySet()) { System.out.println(entry.getKey() + " :" + entry.getValue()); } System.out.println("--------Properties--------"); for(Entry<Object, Object> entry : prop.entrySet()) { System.out.println(entry.getKey() + " :" + entry.getValue()); } } public void setAge(int age) { this.age = age; } public void setName(String name) { this.name = name; } public void setAddress(List<String> address) { this.address = address; } public void setDepts(Set<String> depts) { this.depts = depts; } public void setMaps(Map<String, String> maps) { this.maps = maps; } public void setProp(Properties prop) { this.prop = prop; }
注入
<bean id="book" class="com.kaishengit.service.BookService"> <property name="age" value="23"/> <property name="name" value="Alex"/> <property name="address"> <list> <value>add1</value> <value>add2</value> <value>add3</value> </list> </property> <property name="depts"> <set> <value>s1</value> <value>s2</value> <value>s3</value> </set> </property> <property name="maps"> <map> <entry key="k1" value="v1"/> <entry key="k2" value="v2"/> <entry key="k3" value="v3"/> </map> </property> <property name="prop"> <props> <prop key="p1">v1</prop> <prop key="p2">v2</prop> <prop key="p3">v3</prop> </props> </property> </bean>
main函数中
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); BookService bookService = (BookService) context.getBean("book"); bookService.show();
------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------
构造方法注入
public class UserService { private UserDao userDao; public UserService(UserDao userDao,String name) { this.userDao = userDao; System.out.println("name:" + name); } public void save() { userDao.save(); } }
需要配置
<bean id="userDao" class="com.kaishengit.dao.UserDao"/> <bean id="userService" class="com.kaishengit.service.UserService"> <!-- name是上面构造方法中参数的userDao,ref指注入的是配置中id的userDao这个类 不仅支持name,还支持index <constructor-arg index="0" ref="userDao"/>这里的index指的是给第几个-- 参数传值--> <constructor-arg name="userDao" ref="userDao"/> <constructor-arg name="name" value="Jack"/> </bean>
========================================================================
========================================================================
========================================================================
接下来再说一个自动注入的
<!-- 自动注入 autowire="byName"之后就在整个配置文件中找setXxx方法的这个id叫做xxx的 比如setUserDao,就找id为userDao的,所以id就不能随便改--> <bean id="userDao" class="com.kaishengit.dao.UserDao"/> <bean id="userService" class="com.kaishengit.service.UserService" autowire="byName"/> <!-- 去寻找类型匹配的数据com.kaishengit.dao.UserDao 但是有多个相同类型的就不行了----> <bean id="userDao" class="com.kaishengit.dao.UserDao"/> <bean id="userService" class="com.kaishengit.service.UserService" autowire="byType"/> <!-- 构造方法注入,这种方法是先byName,找不到,就byType --> <bean id="userDao" class="com.kaishengit.dao.UserDao"/> <bean id="userService" class="com.kaishengit.service.UserService" autowire="constructor"/>
标签:
原文地址:http://www.cnblogs.com/itliucheng/p/4463641.html