日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

IOC容器和Bean的配置实例

發布時間:2024/6/30 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 IOC容器和Bean的配置实例 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

實驗1:

<!--實驗1:通過IOC容器創建對象,并為屬性賦值 -->
<!-- 需要由IOC容器創建對象的全類名 -->
<!-- 為了便于從IOC容器中獲取book對象,聲明一個一個唯一的id值 -->
<bean id="book01" class="com.neuedu.spring.bean.Book">
<property name="bookId" value="2001"></property>
<property name="bookName" value="三國演義"></property>
<property name="author" value="羅貫中"></property>
<property name="price" value="22.5"></property>
</bean>


@Test
public void test01() {
//1.創建IOC容器自身的對象
//指定配置文件以類路徑為基準的配置文件名
ApplicationContext ioc= new ClassPathXmlApplicationContext("bean.xml");
//2.從IOC容器中獲取指定的對象
Object bean = ioc.getBean("book01");
System.out.println(bean);
}


注意:
①IOC容器本身對象創建時,會將配置文件中配置好的bean先創建出來
②默認是單實例的,只創建bean的一個對象
③如果設置bean的scope屬性為prototype,那么創建bean的對象就是多實例的,在獲取的時候創建,每次獲取對象都會創建新的
④.從IOC容器中獲取對象
①根據bean的id獲取
②根據bean的類型獲取:要求容器中指定類型的bean是唯一的

  

實驗15:配置通過靜態工廠方法創建的bean[通過靜態方法提供實例對象,工廠類本身不需要實例化!]
<bean id="staticFactory" class="com.neuedu.spring.bean.StaticFactory" factory-method="getBook">
<constructor-arg value="book01"></constructor-arg>
</bean>

實驗16:配置通過實例工廠方法創建的bean[通過實例方法提供實例對象,工廠類本身需要先創建對象!]
<bean id="instanceFactory" class="com.neuedu.spring.bean.InstanceFactory"></bean>
<bean id="bookFromInstanceFactory" factory-bean="instanceFactory" factory-method="getBook">
<constructor-arg value="book02"></constructor-arg>
</bean>

實驗17:配置FactoryBean★
public class MyFactoryBean implements FactoryBean<Book> {

@Override
public Book getObject() throws Exception {
return new Book(22, "無字天書", "好啊", 22.5);
}

@Override
public Class<?> getObjectType() {
return Book.class;
}

@Override
public boolean isSingleton() {
return false;
}

}

實驗22[補充]:測試bean的后置處理器
①在bean的初始化方法調用前后執行操作的專門的對象
②自定義后置處理器實現該接口:org.springframework.beans.factory.config.BeanPostProcessor
③在springmvc中配置一下該bean對象.
<bean class="com.neuedu.spring.bean.Book" init-method="init"></bean>
<bean id="myBeanPostProcessor" class="com.neuedu.spring.bean.MyBeanPostProcessor"></bean>


數據庫連接池:
6) 數據庫連接池
> 數據庫連接池就是存放數據庫連接(Connection)的集合
> 我們獲取一個數據庫連接是一個相對很麻煩的過程,
如果我們獲取一個數據庫連接,使用一次以后就給它關閉了
下一次再去使用的時候就要重新創建一個新的數據庫連接。
> 所以我們提出了一個數據庫連接池的概念,數據庫連接池放的都是數據庫連接(Connection)
我們在去使用數據庫連接時候,不用再去重新創建數據庫連接,而是直接從池中獲取,
使用完的數據庫連接,也不是直接銷毀,而是要放回到連接池。
> 數據庫連接池的常見的屬性:

? 初始連接數量:數據連接池創建以后,保存數據庫連接的數量

? 最小空閑連接數:數據庫連接池最少得未使用的數據庫連接的數量

最大空閑連接數:數據庫連接池最大閑置連接數,當閑置連接數滿了以后,將不會有其他連接進入池

? 每次增加連接數:當數據庫連接都被占用以后,一次性增加的數據庫連接的個數

? 最大連接數:數據庫連接池的最大容量,當最大連接數飽和了,則不再創建新的數據庫連接

? 最大等待時間:當數據庫連接池飽和以后,等待獲取數據庫連接的時間

> 常見的數據庫連接池
- 所有的數據庫連接池都需要實現DataSource,當使用數據庫連接池是,我們便不再需要使用DriverManger獲取數據庫連接
而是使用DataSource。
- Connection getConnection()
- 從數據庫連接池中獲取數據庫連接對象

1.DBCP
- DBCP是Apache出品的一款數據庫連接
- DBCP依賴于commons-pool
- 使用DBCP需要導入兩個jar包:
commons-dbcp-1.4.jar
commons-pool-1.5.5.jar
- 當我們通過數據庫連接池獲取數據庫連接以后,我們所獲取到數據庫連接已經不是我們熟悉的那個Connection
數據庫連接池對Connection對象進行了包裝,它修改Connection的close()方法,
再去調用close()數據庫連接將不會真的關閉,而是要放回到數據庫連接池中,供其他線程使用。
- 核心類:
BasicDataSourceFactory

2.C3P0(重點)
- C3P0使用的是XML作為配置文件
- 使用c3p0需要導入一個jar包:
c3p0-0.9.1.2.jar
- 導入c3p0的配置文件:
1.配置文件的名字:c3p0-cofig.xml
2.配置文件要求放到類路徑下(src)
- 核心類:
ComboPooledDataSource
- 注意:
DataSource就相當于池子,我們的數據庫連接都是從DataSource中獲取的,
如果程序中有多個DataSource的實例,那么我們說你還不如不用數據庫連接池。
所以我們的DataSource在項目中應該只有一個實例。

實驗23:引用外部屬性文件★
jdbc.properties文件:
jdbc.user=root
jdbc.passowrd=123456
jdbc.url=jdbc:mysql://localhost:3306/test
jdbc.driver=com.mysql.jdbc.Driver

<context:property-placeholder location="classpath:jdbc.properties"/>
1.在目標屬性上加@Value注解
@Value("${jdbc.user}")
private String username;
2.
<!-- 根據外部屬性文件中的信息配置數據源 -->
<bean id="comboPooledDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="user" value="${jdbc.user}"></property>
<property name="password" value="${jdbc.passowrd}"></property>
<property name="jdbcUrl" value="${jdbc.url}"></property>
<property name="driverClass" value="${jdbc.driver}"></property>
</bean>


ComboPooledDataSource bean = ioc.getBean(ComboPooledDataSource.class);
Connection connection = bean.getConnection();
System.out.println(connection);
Statement st = connection.createStatement();
ResultSet rs = st.executeQuery("select * from stu");
while(rs.next()){
String string = rs.getString("name");
String string2 = rs.getString("school");
System.out.println(string+"==="+string2);
}

實驗24:基于XML的屬性裝配
①手動裝配
<!-- 屬性的裝配:手動裝配 -->
<bean id="userService" class="com.neuedu.spring.bean.UserService"></bean>
<bean id="userAction" class="com.neuedu.spring.bean.UserAction">
<property name="userService" ref="userService"></property>
</bean>

②自動裝配
<!-- 1.按類型裝配:byType -->
<!-- 首先檢測當前bean中需要裝配的屬性的類型 -->
<!-- 然后在IOC容器中查找匹配這個類型的bean -->
<!-- 如果類型匹配的bean是唯一的,那么就將這個匹配的bean注入到userAction中 -->

<bean id="userService" class="com.neuedu.spring.bean.UserService"></bean>
<bean id="userAction" autowire="byType" class="com.neuedu.spring.bean.UserAction"></bean>

<!-- 2.按bean的id值裝配:byName -->
<!-- 首先檢測當前bean中需要裝配的屬性的屬性名,屬性名是將setXxx()方法去掉set,首字母小寫得到的 -->
<!-- 然后根據屬性名作為id的值,在IOC容器中查找對應的bean -->
<!-- 如果能夠找到,則將找到bean注入進去 -->



6。SpEL簡介【見WORLD文檔---了解】
Spring Expression Language,Spring表達式語言,簡稱SpEL。支持運行時查詢并可以操作對象圖。
和JSP頁面上的EL表達式、Struts2中用到的OGNL表達式一樣,SpEL根據JavaBean風格的getXxx()、setXxx()方法定義的屬性訪問對象圖,完全符合我們熟悉的操作習慣。

6.1 基本語法
SpEL使用#{…}作為定界符,所有在大框號中的字符都將被認為是SpEL表達式。

6.2 使用字面量
●整數:<property name="count" value="#{5}"/>
●小數:<property name="frequency" value="#{89.7}"/>
●科學計數法:<property name="capacity" value="#{1e4}"/>
●String類型的字面量可以使用單引號或者雙引號作為字符串的定界符號
<property name=“name” value="#{'Chuck'}"/>
<property name='name' value='#{"Chuck"}'/>
●Boolean:<property name="enabled" value="#{false}"/>

8.使用注解配置bean
①聲明bean的注解
@Component 將當前類聲明為IOC容器中的一個普通的組件
@Controller 將當前類聲明為IOC容器中的一個控制器組件
@Service 將當前類聲明為IOC容器中的業務邏輯層組件
@Repository 將當前類聲明為IOC容器中的一個持久化層組件
Spring根據上述注解其實并不能分辨當前類是否真的是一個控制器或Dao,即使標記的類和注解不對應也沒有語法錯誤。但在實際工作中,肯定要將專門的注解標記在對應的類上面。

②使用基于注解的bean的配置,需要額外導入一個jar包:spring-aop-4.0.0.RELEASE.jar
③需要設置自動掃描的包
< context:component-scan base-package ="com.neuedu.ioc.bean"/>


④使用注解后,默認按照類名首字母小寫作為id的值,也可以使用value屬性指定id,value屬性名也可以省略注解
注解 id值

@Component commonComponent
public class CommonComponent {
}

@Controller(value="neueduBookAction" ) neueduBookAction
public class BookAction {

}

@Service("happyService" ) happyService
public class BookService {

}

實驗33:使用context:exclude-filter指定掃描包時不包含的類

< context:component-scan base-package ="com.neuedu.ioc.bean"/>
[1]base-package屬性指定一個需要掃描的基類包,Spring容器將會掃描這個基類包及其子包中的所有類。
[2]當需要掃描多個包時可以使用逗號分隔,
[3]如果僅希望掃描特定的類而非基包下的所有類,可使用resource-pattern屬性過濾特定的類,示例:
<context:component-scan base-package="com.neuedu.component" resource-pattern="autowire/*.class"/>
[4]包含與排除
●<context:include-filter>子節點表示要包含的目標類
注意:通常需要與use-default-filters屬性配合使用才能夠達到“僅包含某些組件”這樣的效果。
即:通過將use-default-filters屬性設置為false,禁用默認過濾器,然后掃描的就只是include-filter中的規則
指定的組件了。
●<context:exclude-filter>子節點表示要排除在外的目標類
●component-scan下可以擁有若干個include-filter和exclude-filter子節



⑤使用注解進行自動裝配:@Autowired注解[好處就是:連get、set方法都不用寫!]
[1]首先檢測標記了@Autowired注解的屬性的類型
[2]根據類型進行裝配
[3]如果指定類型的bean不止一個,那么根據需要被裝配的屬性的屬性名做id的值,查找bean
[4]如果根據id值還是沒有找到bean,可以使用@Qualifier注解手動指定要裝配的bean的id.

轉載于:https://www.cnblogs.com/lc-java/p/7445441.html

總結

以上是生活随笔為你收集整理的IOC容器和Bean的配置实例的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。