spring ioc应用
一、从ioc容器获取对象的三种方式
<bean id="user1" class="bean.User"></bean> <!-- 第二种:使用静态工厂方法获取对象 --> <bean id="user2" class="staticFactory.UserFactory" factory-method="getUser1"></bean> <!-- 第三种:使用实例工厂方法获取对象 --> <!-- 第一步:先创建工厂实例 --> <bean id="userFactory" class="staticFactory.UserFactory"></bean> <!-- 第二步:调用工厂方法产生对象 --> <bean id="user3" factory-bean="userFactory" factory-method="getUser2"></bean>
//测试及结果 @Test public void testCreateBean() { User user1 = (User) ac.getBean("user1"); System.out.println(user1); System.out.println("------>>"); User user2 = (User) ac.getBean("user2"); System.out.println(user2); System.out.println("------>>"); User user3 = (User) ac.getBean("user3"); System.out.println(user3); } bean.User@289d2e ------>> bean.User@6754d6 ------>> bean.User@1f2cea2
二、依赖注入两种方式(DI)
//bean对象 public class User { private Integer id; private String name; public User() { } public User(Integer id, String name) { this.id = id; this.name = name; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "User [id=" + id + ", name=" + name + "]"; } }
<!-- 第一种:set方法注入 --> <bean id="user1" class="bean.User"> <property name="id" value="1"></property> <property name="name" value="张三"></property> </bean> <!-- 第二种:构造方法注入 --> <bean id="user2" class="bean.User"> <!-- index参数可以省略,但是这是参数必须按构造方法的顺序来 --> <constructor-arg index="0"> <value >2</value> </constructor-arg> <constructor-arg index="1"> <value>李四</value> </constructor-arg> </bean>
@Test public void testDI() { User user1 = (User) ac.getBean("user1"); System.out.println(user1); System.out.println("------>>"); User user2 = (User) ac.getBean("user2"); System.out.println(user2); }
测试结果:
User [id=1, name=张三] ------>> User [id=2, name=李四]
三、注入集合、数组、自定义类
public class User { private Set<String> strSet; private List<String> strlist; private Map<String, Object> map; private int[] array = new int[50]; //一个自定义的类 private MyObject myObject; //省略get和set方法
//配置
<bean id="myObject" class="bean.MyObject"></bean> <bean id="user" class="bean.User"> <property name="strSet"> <set> <value>set1</value> <value>set2</value> <value>set3</value> </set> </property> <property name="strlist"> <list> <value>list1</value> <value>list2</value> <value>list3</value> </list> </property> <property name="map"> <map> <entry key="key1"> <value>value1</value> </entry> <entry key="key2"> <value>value2</value> </entry> <entry key="key3"> <value>value3</value> </entry> </map> </property> <!-- 注意:数组并没有自己的标签,用<list>标签表示 --> <property name="array"> <list> <value>1</value> <value>2</value> <value>3</value> </list> </property> <property name="myObject" ref="myObject"></property> </bean>
//测试
@Test public void testDI2() { User user = (User) ac.getBean("user"); System.out.println(user.getStrSet()); System.out.println("------>>"); System.out.println(user.getStrlist()); System.out.println("------>>"); System.out.println(user.getMap()); System.out.println("------>>"); System.out.println(Arrays.toString(user.getArray())); System.out.println("------>>"); System.out.println(user.getMyObject()); } //结果 [set1, set2, set3] ------>> [list1, list2, list3] ------>> {key1=value1, key2=value2, key3=value3} ------>> [1, 2, 3] ------>> bean.MyObject@2b9406
四、基于注解方式的依赖注入
使用基于XML的依赖注入使用起来比较麻烦,需每次都向XML文件中配置,基于注解的方式能使工作更快捷。
1.向spring声明我们在哪些包中使用了注解的方式实现依赖注入:
<context:component-scan base-package="dao,service"></context:component-scan>
2.使用到的注解
声明注解:@Component、@Controller、@Service、@Repository,四个注解的作用完全相同,相当于在配置文件中声明了一个类,包括了类中的属性。其id的默认值为第一个字母为小写的类的名字。例如:UserDaoImpl---->userDaoImpl;之所以那么多个,是给你在不同的代码层中使用。如:控制层中使用@Controller标签。
依赖注入注解:@Resource,给属性注入值。但是为了不硬编码,一般都是给属性为自定义类来注入。如要给普通属性注入,请使用xml的方式。

浙公网安备 33010602011771号