1.如果你的英語足夠好可以去看spring的官網。
位址如下
https://spring.io/ 2.簡單介紹spring①開源輕量級架構,說白了就是簡化開發
②核心部分:AOP切面程式設計:我了解的就是在不改變已有代碼的情況下去擴充一些功能。
IOC控制反轉:還記得剛學程式的時候麼,是private Student stu=new Student();這麼幹的。ioc就是把這個過程 交給spring容器來處理。是以叫做控制反轉。
DI依賴注入:這個是基于IOC的,也就是先交給spring管理,然後通過spring給屬性注入值。
③spring在javaweb的三層結構中都有相應的解決方案。
web層 springMVC
service層 IOC
dao層 jdbcTemplate(一般會被Hibernate、Mybatis代替)
3.導入jar包
①去官網下載下傳
下載下傳并解壓你會看到libs檔案夾下的jar包有這樣的特點
spring-aop-5.0.5.RELEASE.jar這個是我們要用的jar包
spring-aop-5.0.5.RELEASE-sources.jar這個是源碼
②如果用spring的基本功能,導入4個核心的jar包就可以了。
spring-context-5.0.5.RELEASE-javadoc.jar
spring-core-5.0.5.RELEASE.jar
spring-expression-5.0.5.RELEASE.jar
spring-beans-5.0.5.RELEASE.jar
另外還需要加入commons-logging-1.1.3.jar、log4j-1.2.11.jar兩個日志的jar包,不然會出現下面異常:
Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory
③建立spring核心配置檔案:
(1)spring核心配置檔案名稱和位置不是固定的,建議放到src下面,官方建議applicationContext.xml
(2)引入schema限制
spring-framework-5.0.5.RELEASE/docs/spring-framework-reference/core.html
從官方下載下傳的spring版本中找到docs->spring-framework-reference->core.html(中可以找到相關schema限制)
如圖:
applicationContext.xml:
<?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="user" class="test1.User" ></bean>
User類:
public class User {
public void show(){
System.out.println("我是User");
}
}
測試類:
public class MainTest {
public static void main(String[] args){
//1.加載xml檔案
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
//2.拿到user對象,這裡user是bean裡面的id
User user = (User)context.getBean("user");
user.show();
}
運作結果:
經過上面的步驟,最簡單的通過配置bean的方式來管理對象就成功了。下面詳細總結一下。
spring管理bean方式(IOC):
①xml配置方式(xml方式)
②注解方式(用的最多)(注解方式)
spring屬性注入方式(DI):
①set方法注入(重點)(xml方式)
②有參構造方法注入(xml方式)
③注解注入(用的比較多)(注解方式)
4.介紹Spring管理bean(xml方式)
(1)先來介紹bean标簽屬性
id:唯一辨別,不能包含特殊字元。
name:跟id作用一樣,但是可以包含特殊字元。
class:指定類的路徑。
scope(範圍):singleton單例 ,prototype(多例)
(2)bean執行個體化的三種方式:
①使用類的無參構造函數(重點)
注意User類的變化,編寫一個有參構造方法(此時不再有無參構造函數):
下面再運作會報異常:
Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'user' defined in class path resource [applicationContext.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [test1.User]: No default constructor found; nested exception is java.lang.NoSuchMethodException: test1.User.()
下面我手動再寫一個無參構造函數,如下:
再來看運作結果,運作成功:
說明預設使用無參構造函數來執行個體化的。
②使用靜态工廠執行個體化(建立靜态方法,傳回類的對象)
注意applicationContext.xml變化
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="user" class="test1.BeanFactory" factory-method="getUser" ></bean>
建立靜态工廠類BeanStaticFactory(注意裡面的方法是 static的):
運作測試類MainText:
③使用執行個體工廠建立(建立非靜态方法,傳回類的對象)
注意applicationContext.xml變化:
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="user" class="test1.BeanStaticFactory" factory-method="getUser" ></bean>-->
<bean id="beanCommonFactory" class="test1.BeanCommonFactory" ></bean>
<bean id="user" factory-bean="beanCommonFactory" factory-method="getUser"></bean>
建立普通工廠BeanCommonFactory
(3)屬性注入
一.使用有參構造函數注入屬性
User類
applicationContext.xml
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="user" class="test1.User" >
<constructor-arg name="userName" value="小明"></constructor-arg>
</bean>
<!--<bean id="user" class="test1.BeanStaticFactory" factory-method="getUser" ></bean>-->
<!--<bean id="beanCommonFactory" class="test1.BeanCommonFactory" ></bean>
<bean id="user" factory-bean="beanCommonFactory" factory-method="getUser"></bean>-->
運作測試類MainTest結果:
二.使用set方法注入(重點)
applicationContext.xml
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="user" class="test1.User" >
<property name="userName" value="小明"></property>
</bean>
<!--<bean id="user" class="test1.BeanStaticFactory" factory-method="getUser" ></bean>-->
<!--<bean id="beanCommonFactory" class="test1.BeanCommonFactory" ></bean>
<bean id="user" factory-bean="beanCommonFactory" factory-method="getUser"></bean>-->
運作測試類MainText結果如下:
①注入對象類型:
建立UserDao類:
建立UserService類:
修改MainTest類:
運作測試結果:
②注入複雜類型
數組、List集合、Map集合、Properties
修改UserService類:
public class UserService {
private UserDao userDao;
private Integer[] array;
private List<String> list;
private Map<String,String> map;
private Properties properties;
public UserDao getUserDao() {
return userDao;
}
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public Integer[] getArray() {
return array;
}
public void setArray(Integer[] array) {
this.array = array;
}
public List<String> getList() {
return list;
}
public void setList(List<String> list) {
this.list = list;
}
public Map<String, String> getMap() {
return map;
}
public void setMap(Map<String, String> map) {
this.map = map;
}
public Properties getProperties() {
return properties;
}
public void setProperties(Properties properties) {
this.properties = properties;
}
修改applicationContext.xml
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="userDao" class="test2.UserDao"></bean>
<bean id="userService" class="test2.UserService">
<property name="userDao" ref = "userDao"></property>
<property name="array">
<list>
<value>1</value>
<value>2</value>
<value>3</value>
</list>
</property>
<property name="list">
<list>
<value>小明1</value>
<value>小明2</value>
<value>小明3</value>
</list>
</property>
<property name="map">
<map>
<entry key="a" value="A"></entry>
<entry key="b" value="B"></entry>
<entry key="c" value="C"></entry>
</map>
</property>
<property name="properties">
<props>
<prop key="userName">test</prop>
<prop key="password">123456</prop>
</props>
</property>
</bean>
修改MainTest類
public static void main(String[] args){
//1.加載xml檔案
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
//2.拿到user對象,這裡user是bean裡面的id
//User user = (User)context.getBean("user");
UserService userService = (UserService)context.getBean("userService");
UserDao userDao=null;
Integer[] array=null;
List<String> list=null;
Map<String,String> map=null;
Properties properties=null;
if(userService!=null){
userDao=userService.getUserDao();
array=userService.getArray();
list=userService.getList();
map=userService.getMap();
properties=userService.getProperties();
}
if(array!=null){
for(int i=0;i<array.length;i++){
System.out.println(array[i]);
}
}
if(list!=null&&list.size()>0){
for (String s:list){
System.out.println(s);
}
}
if(map!=null){
for (Map.Entry<String, String> entry : map.entrySet()) {
System.out.println(entry.getKey() + ":" + entry.getValue());
}
}
if(properties!=null){
for (Map.Entry<Object, Object> entry : properties.entrySet()) {
System.out.println(entry.getKey() + "=" + entry.getValue());
}
}
}
5.Spring管理Bean(注解方式)
注解就是給類打上标記,這樣spring才能識别管理
注解可以打在類上,也可以打在屬性上
一:使用注解來建立對象
打在類上的注解:
@Controller(習慣放在web層)
@Service(習慣放在業務層)
@Repository(習慣放在持久層)
@Component
目前這四個注解的功能是一樣的,都是放在類上用來建立對象。
需要再引入spring-aop-5.0.5.RELEASE.jar jar包
修改applicationContext.xml(多了spring-context.xsd schema限制,在聯網的情況下輸入<context:component-scan base-package="test1,test2"></context:component-scan>會自動添加限制)
修改User類:(@Component(value="user") 這裡user相當于bean裡面的id,可以省略value值)
MainText類:
public static void main(String[] args){
//1.加載xml檔案
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
//2.拿到user對象,這裡user是bean裡面的id
User user = (User)context.getBean("user");
user.show();
}
運作結果(省略)
spring通過@Scope(value="prototype")實作多例,spring預設生成的對象是單例的
如下:
@Component(value = "user")
@Scope(value = "prototype")
private String userName;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public void show(){
System.out.println("我是User");
System.out.println("我的userName屬性值:"+this.userName);
}
MianTest測試:
public static void main(String[] args){
//1.加載xml檔案
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
//2.拿到user對象,這裡user是bean裡面的id
User user1 = (User)context.getBean("user");
User user2 = (User)context.getBean("user");
// user.show();
System.out.print(user1==user2);
}
二:使用注解來注入屬性
@Autowired (按類型裝配)
@Resource(按名稱裝配)
關于這兩個注解的差別大家可以去網上找些資料,關于他們的資料很多
直接上代碼:
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!--可以掃描包下面的 類、屬性、方法上的注解-->
<context:component-scan base-package="test1,test2"></context:component-scan>
UserDao類:
@Repository
public class UserDao {
public void show(){
System.out.println("我是UserDao");
}
UserService類:(這裡用的是@Autowired注解,關于@Resource注解,下去可以自己試試)
@Service
@Autowired
private UserDao userDao;
public UserDao getUserDao() {
return userDao;
}
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
測試MainText類:
public static void main(String[] args){
//1.加載xml檔案
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
//2.拿到user對象,這裡user是bean裡面的id
UserService userService = (UserService)context.getBean("userService");
UserDao userDao=userService.getUserDao();
if(userDao!=null){
userDao.show();
}
}
運作結果省略。
————————————————
版權聲明:本文為CSDN部落客「ordinarySmile」的原創文章,遵循CC 4.0 BY-SA版權協定,轉載請附上原文出處連結及本聲明。
原文連結:
https://blog.csdn.net/qiwansong/article/details/80011931