Spring初级知识学习(1)

spring的技术核心是IOC(控制反转),DI(依赖注入)以及AOP(面向切面编程)

可以通过spring框架帮我们生成对象

spring可用在java工程里,也可以用在web工程中。

首先找需要的jar包。有spring.jar,commons-logging.jar包,然后拷贝一个applicationContext.xml。也可以通过myeclipse自动完成.

空的applicationContext.xml文件内容如下

<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:aop="http://www.springframework.org/schema/aop"
  xmlns:tx="http://www.springframework.org/schema/tx"
  xsi:schemaLocation="
   http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.5.xsd
   http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-2.5.xsd
   http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
 </beans>

通过下面语句加载applicationContext.xml

BeanFactory bf= new ClassPathXmlApplicationContext("applicationContext.xml");

其中BeanFactory是org.springframework.beans.factory.BeanFactory

而ClassPathXmlApplicationContext是org.springframework.context.support.ClassPathXmlApplicationContext。它的构造方法接收一个配置文件,如果不写会默认为applicationContext.xml。写了就会去找相应的xml文件。也就是说这个applicationContext.xml名称不是固定的,是可以改的。

在加载配置文件的过程中会自动创建配置文件中的Bean。比如:

<bean name="userDaoImpl" class="com.ts.dao.imp.UserDaoImpl"></bean>
 
 <bean name="user" class="com.ts.vo.User"></bean>

会自动调用UserDaoImpl和User的无参构造来创建userDaoImpl和user的两个实例。

通过Set方法进行注入。比如在配置文件中做了如果下配置

<bean name="userDaoImpl" class="com.ts.dao.imp.UserDaoImpl"></bean>
 <bean id="userDaoServiceImp" class="com.ts.dao.service.imp.UserDaoServiceImp">
 <!-- 定义setxxx方法进行注入 -->
   <property name="userDaoImpl" ref="userDaoImpl"></property>
 </bean>

加载配置文件时会自动创建UserDaoImpl的实例userDaoImpl,UserDaoServiceImp的实例userDaoServiceImp。因为

在userDaoServiceImp这个bean中指定了Property。property的name一定要是UserDaoServiceImp类中的成员名,ref指定(在配置文件中就行)name为‘userDaoImpl’的bean。UserDaoServiceImp类一定要给userDaoImpl加上setter方法。

UserDaoServiceImp类代码如下:

package com.ts.dao.service.imp;

import java.util.List;

import com.ts.dao.imp.UserDaoImpl;
import com.ts.service.UserDaoService;
import com.ts.vo.User;

public class UserDaoServiceImp implements UserDaoService {
 private UserDaoImpl userDaoImpl;
 

 public UserDaoServiceImp() {
  super();
 }

 public UserDaoImpl getUserDaoImpl() {
  return userDaoImpl;
 }

 public void setUserDaoImpl(UserDaoImpl userDaoImpl) {
  this.userDaoImpl = userDaoImpl;
  System.out.println("setXXX");
 }

 public UserDaoServiceImp(UserDaoImpl userDaoImpl) {
  super();
  this.userDaoImpl = userDaoImpl;
  System.out.println("daichangouzao");
  
 }

 public void deleteUser(User user) {
  // TODO Auto-generated method stub
        userDaoImpl.deleteUser(user); 
 }

 public List<User> getAllUser() {
  // TODO Auto-generated method stub
  return userDaoImpl.getAllUser();
 }

 public void insertUser(User user) {
  // TODO Auto-generated method stub
        userDaoImpl.insertUser(user);
 }

 public void updateUser(User user) {
  // TODO Auto-generated method stub
        userDaoImpl.updateUser(user);
 }

}

 

<!-- 根据实例工厂创建bean -->
 <bean name="objFactory" class="com.ts.factory.ObjectFactory"></bean>
 <bean name="userDaoImpl1" factory-bean="objFactory" factory-method="createUserDaoImp"></bean>

即com.ts.factory.ObjectFactory类的createUserDaoImp方法返回一个对象名为userDaoImpl1的实例。ObjectFactory代码如下

package com.ts.factory;

import com.ts.dao.imp.UserDaoImpl;

public class StaticObjectFactory {
 public static UserDaoImpl createUserDaoImp(){
  System.out.println("jingtai gong chang");
  return new UserDaoImpl();
 }
}

 <!-- 根据静态工厂创建bean -->
 <bean name="userDaoImpl2" class="com.ts.factory.StaticObjectFactory" factory-method="createUserDaoImp"></bean>

即com.ts.factory.StaticObjectFactory类的静态方法createUserDaoImp返回一个对象名为userDaoImpl2的实例。ObjectFactory代码如下

package com.ts.factory;

import com.ts.dao.imp.UserDaoImpl;

public class StaticObjectFactory {
 public static UserDaoImpl createUserDaoImp(){
  System.out.println("jingtai gong chang");
  return new UserDaoImpl();
 }
}


 <!-- 调用构造方法进行注入 -->
 <bean id="userDaoServiceImp1" class="com.ts.dao.service.imp.UserDaoServiceImp">
   <constructor-arg ref="userDaoImpl"></constructor-arg>
 </bean>

通过带一个参数的.UserDaoServiceImp的构造方法创建一个对象名为userDaoServiceImp1的实例。userDaoImpl是配置文件中的一个Bean的name。

类UserDaoServiceImp的代码如上。

Person类代码如下:

public class Person {
 private String name;
 private  int age;
 private String gender;
 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;
 }
 public String getGender() {
  return gender;
 }
 public void setGender(String gender) {
  this.gender = gender;
 }
 

}

配置文件如下:基本属性值注入

<bean name="person" class="com.ts.vo.Person">
   <property name="name" value="张三"></property>
   <property name="age" value="18"></property>
   <property name="gender" value="男"></property>
 </bean>

 

加载代码执行如下

BeanFactory bf= new ClassPathXmlApplicationContext("applicationContext.xml");
  Person p = (Person)bf.getBean("person");
  System.out.println(p.getName()+"-----"+p.getAge()+"----"+p.getGender());

 

控制台输出如下:张三-----18----男

 

 

对数组属性的注入。在Person中加一个数组类的属性

private String[] info;
 
 public String[] getInfo() {
  return info;
 }
 public void setInfo(String[] info) {
  this.info = info;
 }

 

配置文件如下:

<property name="info">
     <list>
       <value>info1</value>
       <value>info2</value>
       <value>info3</value>
     </list>
   </property>

 

List集合注入

private List<String> list;
 
 
 public List<String> getList() {
  return list;
 }
 public void setList(List<String> list) {
  this.list = list;
 }

配置文件如下:

<property name="list">
     <list>
       <value>list1</value>
       <value>list2</value>
       <value>list3</value>
     </list>
   </property>

set集合的注入

private Set<String> set;
 
 
 
 public Set<String> getSet() {
  return set;
 }
 public void setSet(Set<String> set) {
  this.set = set;
 }

<property name="set">
     <set>
       <value>set1</value>
       <value>set2</value>
       <value>set3</value>
     </set>
   </property>

 

for(String info:p.getInfo()){
   System.out.println(info);
  }
  for(String info:p.getList()){
   System.out.println(info);
  }
  for(String info:p.getSet()){
   System.out.println(info);
  }

 

结果:

张三-----18----男
info1
info2
info3
list1
list2
list3
set1
set2
set3
Map集合的注入Person类增加下面代码

private Map<String,Integer> map;
 public Map<String, Integer> getMap() {
  return map;
 }
 public void setMap(Map<String, Integer> map) {
  this.map = map;
 }

配置文件增加下面内容

<property name="map">
     <map>
        <entry key="key1" value="100"></entry>
        <entry key="key2" value="200"></entry>
        <entry key="key3" value="300"></entry>
     </map>
   </property>

 

测试代码如下

Map<String,Integer> map= p.getMap();
  Set<String> kSet = map.keySet();
  Iterator<String> it = kSet.iterator();
  while(it.hasNext()){
   String key = it.next();
   Integer value=map.get(key);
   System.out.println(key+"----"+value);
  }

输出结果

key1----100
key2----200
key3----300

你可能感兴趣的:(Spring初级知识学习(1))