Spring的簡單使用(1)

一:IOC(控制反轉):它是由spring容器進行對象的創建和依賴注入,程式設計師使用時直接取出即可

正轉:例如:

Student stu=new Student();

stu.setname(“tom”);

stu.setAge(20);

在正轉中,由程式設計師自覺來創建對象,給對象注入值。

反轉:由spring容器來自動創建對象。在spring.xml文件中如下:

<bean id="stu" class="com.ztb.dao.Student">
<property name="name" value="tom"></property>
<property name="age" value="20"></property>
</bean>
標籤解釋:id指的是創建的對象的名字,class表示要創建的對象在哪個包中的哪個類
property name表示成員變數的名字,value表示給成員變數賦值
給創建的對象賦值的兩種方法:

A:使用setter方法注入:

注入分為簡單類型注入和引用類型注入:

簡單類型注入值使用value屬性

引用類型注入值使用ref屬性

注意:使用setter注入必須要有set方法和無參構造方法。

簡單類型注入:

<bean id="school" class="com.ztb.pojo.School">
<property name="name" value="海淀大學"></property>
<property name="address" value="海定區"></property>
</bean>

引用類型注入:

有兩個類School和Student,其中Student類中有school的對象:

private String name;
private String age;
private School school;

則引用注入如下:
<bean id="stu" class="com.ztb.pojo.Student">
<property name="name" value="zhangsan"></property>
<property name="age" value="20"></property>
<property name="school" ref="school"></property>
</bean>

<bean id="school" class="com.ztb.pojo.School">
<property name="name" value="海淀大學"></property>
<property name="address" value="海定區"></property>
</bean>

B:使用構造方法注入:

 a:使用構造方法的參數名稱進行注入值:

<bean id="school" class="com.ztb.pojo.School">
<constructor-arg name="name" value="海鼎"></constructor-arg>
<constructor-arg name="address" value="海鼎"></constructor-arg>
</bean>

b:使用構造方法參數的下標註入值:

<bean id="student" class="com.ztb.pojo.Student">
<constructor-arg index="0" value="zhangsan"></constructor-arg>
<constructor-arg index="1" value="20"></constructor-arg>
<constructor-arg index="2" ref="school"></constructor-arg>
</bean>

c:使用默認的構造方法的參數的順序注入值:

 

<bean id="student1" class="com.ztb.pojo.Student">
<constructor-arg value="zhangsan"></constructor-arg>
<constructor-arg value="20"></constructor-arg>
<constructor-arg ref="school"></constructor-arg>
</bean>

 注意:使用構造方法注入必須要有有參構造方法

 

 

 

二:項目案例:使用三層架構進行用戶的插入操作:介面層,業務邏輯層,數據訪問層

1非spring接管的三層項目構建:

實體類:User

數據訪問層:介面UserMapper,實現類UserMapperImpl

業務邏輯層:介面UserService,實現類UserServiceImpl

  實現類中一定要有UserMapper對象,並且介面一定要指向實現類,UserMapper usermapper=new UserMapperImpl;

介面層:實現類UserController

  實現類中一定要有UserServicer對象,並且介面一定要指向實現類,UserService userservice=new UserServiceImpl;

 

2:spring接管的三層項目構建:

實體類:

private Integer uid;
private String uname;
private String uage;

數據訪問層:

public class UserMapperImpl implements UserMapper{

public int insert(User user) {
System.out.println(user.getUname()+"插入成功");
return 1;
}
}

業務邏輯層:

private UserMapper userMapper;


public void setUserMapper(UserMapper userMapper) {
this.userMapper = userMapper;
}

public int insert(User user) {

return userMapper.insert(user);
}

介面層:

 private UserService userService;
public void setUserService(UserService userService) {
this.userService = userService;
}
public int insert(User user){
return userService.insert(user);
}

Spring整合:

<bean id="usermapper" class="com.ztb.dao.UserMapperImpl"></bean>
<bean id="userservice" class="com.ztb.service.UserServiceImpl">
<property name="userMapper" ref="usermapper"></property>
</bean>
<bean id="usercontroller" class="com.ztb.controller.UserController">
<property name="userService" ref="userservice"></property>
</bean>

測試:

 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserController usercontroller = (UserController) context.getBean("usercontroller");
usercontroller.insert(new User(1,"張三","3"));

 

 

spring接管的三層項目構建(使用註解):

實體類:

private Integer uid;
private String uname;
private String uage;

數據訪問層:

@Repository
public class UserMapperImpl implements UserMapper{

public int insert(User user) {
System.out.println(user.getUname()+"插入成功");
return 1;
}
}

業務邏輯層:

@Service
public class UserServiceImpl implements UserService{
@Autowired
private UserMapper userMapper;

public int insert(User user) {

return userMapper.insert(user);
}
}

介面層:

@Controller
public class UserController {
@Autowired
private UserService userService;

public int insert(User user){
return userService.insert(user);
}

Spring掃描包:

<context:component-scan base-package="com.ztb"></context:component-scan>

測試:

 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserController usercontroller = (UserController) context.getBean("userController");//因為默認是駝峰命名
usercontroller.insert(new User(1,"張三","3"));

 

 

三:基於註解的IOC,也稱依賴注入

a:創建對象的註解:

@Component:可以創建任意對象,創建的對象默認名稱是類名的駝峰命名法,也可以指定對象的名稱

@Component
public class School {
@Value("海鼎")
private String name;
@Value("海定區")
private String address;

@Controller:專門用來創建控制器的對象(Servlet),這種對象可以接收用戶的請求。可以返回處理結果給客戶端

@Service:專門用來創建業務邏輯層的對象,負責向下訪問數據訪問層,處理完畢後的結果返回給介面層

@Repository:專門用來創建數據訪問層的對象,負責資料庫中的增刪改查

注意:使用註解的IOC,需要在spring.xml文件中配置掃描包:

<context:component-scan base-package="com.ztb.pojo"></context:component-scan>

b:依賴注入的註解

值類型的注入:

@Value:用來給簡單類型注入值:

@Component 創建的對象名默認為school
public class School {
@Value("海鼎")
private String name;
@Value("海定區")
private String address;

引用類型的注入:

1@Autowired:使用類型注入值,從整個Bean工廠中搜索同源類型的對象進行注入

同源類型:

a:被注入的類型(Student中的school)與注入的類型是完全相同的類型

@Component
public class Student {
@Value("張三")
private String name;
@Value("20")
private String age;
@Autowired
private School school;


@Component 創建的對象名默認為school
public class School {
@Value("海鼎")
private String name;
@Value("海定區")
private String address;

b:被注入的類型(Student中的school父)與注入的類型是父子類類型

public class Student {
@Value("張三")
private String name;
@Value("20")
private String age;
@Autowired
private School school;


@Component("school1")
public class School {
@Value("海鼎")
private String name;
@Value("海定區")
private String address;


@Component("school")
public class SubSchool extends School{
@Value("小海地")
private String name;
@Value("小海底")
private String address;

c:被注入的類型(Student中的school介面)與注入的類型是介面與實現類的類型

注意:在有父子類的情況下,使用按類型注入,就意味著有多個可注入的對象,此時按照名稱進行二次篩選,選中與被注入對象相同名稱的對象進行注入

2:@Autowired+@Qualifier:使用名稱注入值,從整個Bean工廠中搜索相同名稱的對象進行注入

a:被注入的類型(Student中的school)與注入的類型是完全相同的類型

@Component("school1")
public class School {
@Value("海鼎")
private String name;
@Value("海定區")
private String address;


@Component
public class Student {
@Value("張三")
private String name;
@Value("20")
private String age;
@Autowired
@Qualifier("school1")
private School school;

b:被注入的類型(Student中的school父)與注入的類型是父子類類型

@Component
public class Student {
@Value("張三")
private String name;
@Value("20")
private String age;
@Autowired
@Qualifier("school1")
private School school;


@Component("school1")
public class School {
@Value("海鼎")
private String name;
@Value("海定區")
private String address;




@Component("school")
public class SubSchool extends School{
@Value("小海地")
private String name;
@Value("小海底")
private String address;

 

四:為應用指定多個Spring配置文件:

1:

 

 2:三層架構改造:

 

 在total.xml中:

<import resource="applicationContext_*.xml"></import>匯總