>需要注意的是,刚才在编码过程中,出现了java.lang.NoClassDefFoundError: com/mchange/v2/ser/Indirector的错误,出现错误原因是没有导⼊mchange-commons-java-0.2.11.jar。
实例13:基于XML的⾃动装配
举例应⽤场景:⾃动装配应⽤于⾃定义类型属性。假如⼀个类中的属性为⾃定义类,在Bean中配置时,可以通过<property name=" "
ref=" IOC容器中的Bean"></property>进⾏⼿动装配。
⾃动装配:根据指定的装配规则,不需要明确指定,就可以让Spring⾃动将匹配的属性值注⼊Bean中。
装配模式:①<bean id=" " class=" " autowire="default"></bean>:不⾃动装配
②<bean id=" " class=" " autowire="byName"></bean>:根据属性名称,在IOC容器中寻id和该属性名称相同的Bean,注⼊到Bean中
③<bean id=" " class=" " autowire="byType"></bean>:根据属性类型,在IOC容器中寻类型相同的Bean,注⼊到Bean中
④<bean id=" " class=" " autowire="constructor"></bean>:根据构造器中的参数,注⼊到Bean中。但是当⼀个Bean中存在多个构造器时就会很复杂,因此不建议使⽤。
♥⼤多时候会使⽤注解⽅式来实现⾃动装配,在XML⽂档中进⾏的⾃动装配会显得不⽅便,实际项⽬中更多使⽤注解的⽅式实现。
♥当⼀个类中的属性时⾃定义类型的集合时,当⾃动装配时,会将所有符合autowire条件的Bean都装⼊该集合中。
实例14:SpEL(Spring Expression Language)测试
SpEL的语法符号为:#{...}
>使⽤字⾯量进⾏赋值
<property name="count" value="#{5*12}"/>
>引⽤其他Bean的某个属性值
<bean id="emp05" class="com.parent.bean.Employee">
<property name="empId" value="1003"/>
<property name="empName" value="Kate"/>
<property name="age" value="21"/>
<property name="deptName" value="#{dept.deptName}"/>
</bean>
>引⽤其他Bean,(不需要ref=""来引⽤其他Bean)
<bean id="emp04" class="com.parent.bean.Employee">
<property name="empId" value="1003"/>
<property name="empName" value="Kate"/>
<property name="age" value="21"/>
<property name="detp" value="#{dept}"/>
</bean>
>调⽤静态⽅法:#{T(全类名).静态⽅法名(参数)}
<bean id="employee" class="com.spel.bean.Employee">
<!-- 在SpEL表达式中调⽤类的静态⽅法 -->
<property name="circle" value="#{T(java.lang.Math).PI*20}"/>
</bean>
>调⽤⾮静态⽅法:#{对象.⽅法名}
<!-- 创建⼀个对象,在SpEL表达式中调⽤这个对象的⽅法 -->
<bean id="salaryGenerator" class="com.spel.bean.SalaryGenerator"/>
<bean id="employee" class="com.spel.bean.Employee">
<!-- 通过对象⽅法的返回值为属性赋值 -->
<property name="salayOfYear" value="#{SalaryOfYear(5000)}"/>
</bean>
※实例15:通过注解分别创建Dao、Service、Controller
<!-- 实例15:通过注解分别创建Dao、Service、Controller(控制器:控制⽹站跳转逻辑Servlet) --> <!-- 通过给Bean上添加某些注解,可以快速的将Bean加⼊到IOC容器中
某个类上添加任何⼀个注解都能快速的将这个组件加⼊到IOC容器的管理中
Spring中有四个注解
@Controller:控制器:推荐给控制器层的组件添加该注解(Servlet包下)
@Service
@Rspository:给数据库层(持久化层,Dao层)的组件添加该注解
@Componet:WebUtils:给不属于以上基层的组件添加该注解
使⽤注解将组件快速加⼊容器中需要以下⼏步
1>给要添加的组件上标四个注解中的任⼀个
2>告诉Spring⾃动扫描加了注解的组件:依赖context名称空间spring aop应用场景
3>⼀定要导⼊AOP包,⽀持加注解模式的
-->
<!-- context:component-scan:⾃动组件扫描 -->
<context:component-scan base-package="com.cuco"></context:component-scan>
@Controller
public class BookServlet {
}
public class IOCTest {
ApplicationContext ioc = new ClassPathXmlApplicationContext("l");
/
*
* 使⽤注解加⼊到容器中的组件,和使⽤配置加⼊到容器中的组件⾏为默认都是⼀样的;
* 1.组件的id,默认就是组件的类名⾸字母⼩写
* 2.组件的作⽤域,默认都是单例的
* >也可以新写组件的新名字通过()
* >也可以将组件的作⽤域改为多实例,@Scope(value="prototype")
* */
@Test
public void test() {
Object bean = Bean("bookDao");
Object bean1 = Bean("bookDao");
System.out.println(bean == bean1);
}
}
实例16:使⽤context:include-filter指定扫描包时要包含的类
实例17:使⽤context:include-filter指定扫描包时不包含的类
<!-- context:component-scan:⾃动组件扫描 -->
<context:component-scan base-package="com.cuco"></context:component-scan>
<!-- 实例17:使⽤context:include-filter指定扫描包时不包含的类 -->
<context:component-scan base-package="com.cuco">
<!-- 扫描时可以排除⼀些不要的组件
type="annotation":指定排除规则:按照注解进⾏排除,标注了指定注解的组件不要
expression="":注解的全类名
type="assignable":指定排除某个具体的类,按照类排除
expression="":类的全类名
-->
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/> <context:exclude-filter type="assignable" expression="com.cuco.service.BookService"/>
</context:component-scan>
<!-- use-default-filters设置为false:不扫描所有组件 -->
<context:component-scan base-package="com.cuco" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Service"/> </context:component-scan>
※实例18:使⽤@Autowired注解实现根据类型实现⾃动装配
/*
* @Autowired:Spring会⾃动的为这个属性赋值;
* ⼀定会去容器中到这个属性对应的组件
* */
@Controller
public class BookServlet {
//⾃动装配,⾃动的为这个属性赋值,不需要new⼀个对象
@Autowired
private BookService bookService;
}
@Autowired注解
[1]根据类型实现⾃动装配。
[2]构造器、普通字段(即使是⾮public)、⼀切具有参数的⽅法都可以应⽤@Autowired注解
[3]默认情况下,所有使⽤@Autowired注解的属性都需要被设置。当Spring不到匹配的bean装配属性时,会抛出异常。
[4]若某⼀属性允许不被设置,可以设置@Autowired注解的required属性为 false
[5]默认情况下,当IOC容器⾥存在多个类型兼容的bean时,Spring会尝试匹配bean的id值是否与变量名相同,如果相同则进⾏装配。如果bean的id值不相同,通过类型的⾃动装配将⽆法⼯作。此时可以在@Qualifier注解⾥提供bean的名称。Spring甚⾄允许在⽅法的形参上标注@Qualifiter注解以指定注⼊bean的名称。
[6]@Autowired注解也可以应⽤在数组类型的属性上,此时Spring将会把所有匹配的bean进⾏⾃动装配。
[7]@Autowired注解也可以应⽤在集合属性上,此时Spring读取该集合的类型信息,然后⾃动装配所有与之兼容的bean。
[8]@Autowired注解⽤在java.util.Map上时,若该Map的键值为String,那么 Spring将⾃动装配与值类型兼容的bean作为值,并以bean的id值作为键。
※实例19:如果资源类型的bean不⽌⼀个,默认根据@Autowired注解标记的成员变量名作为id查bean,进⾏装配
※实例20:如果根据成员变量名作为id还是不到bean, 可以使⽤@Qualifier注解明确指定⽬标bean的id
public class BookServlet {
//⾃动装配,⾃动的为这个属性赋值,不需要new⼀个对象
//@Qualifier:指定⼀个名字作为该组件的id,让Spring不要使⽤变量名作为id
@Qualifier("bookService")
@Autowired
private BookService bookServiceExt2;
}
※实例21:@Autowired注解的required属性指定某个属性允许不被设置:@Autowired(required="false")
总结@Autowired流程:
1>按照所注解的类型去Spring容器中寻对应的组件:BookService bookService = Bean(BookService.class)
(1)如果到⼀个对应的组件,则赋值给变量bookService;
(2)如果没到,则抛出异常
(3)如果到多个(例如会将bookService所有的⼦类出)
①根据变量名作为id继续匹配:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论