SpEL、自动装配、包扫描进行自动装配
<bean name="userDao" class="com.zzxtit.spring.ioc.di.UserDao"
p:name="wei" p:age="1"/>
//bean实例化一个对象
<bean id="userService" class="com.zzxtit.spring.ioc.di.UserService" >
<property name="userName" value="#{true and false}"></property>
//el表达式的基本语法#{......}
//在el表达式中我们可以加入一些运算,就像上面的true and false一样
//最终的计算结果是false
//常用的操作符请看下面的总结
<property name="udao" value="#{userDao}"></property>
//对于引用类型的注入,我们在不使用el表达式的时候我们需要使用ref来进
//行注入但是我们使用了el表达式之后我们可以统一使用value来进行注入
//el表达式会在我们的xml找到我们name或者id相匹配的bean来进行注入
</bean>
</beans>
//下面是我们按照类型自动装配的代码
//和上面代码的主要区别在于我们的第二个bean中没有了property,让他自己进行注入
//自动注入的一些总结见下面
<bean name="userDao" class="com.zzxtit.spring.ioc.di.UserDao"
p:name="wei" p:age="1"/>
<bean id="userService" class="com.zzxtit.spring.ioc.di.UserService" autowire="byType">
<!-- <property name="userName" value="#{true and false}"></property>
<property name="udao" value="#{userDao}"></property> -->
<!-- xml文件中ctrl+shift+/注释 +\取消注释 -->
</bean>
常用的el操作符
关系操作符== 小于<大于>小于等于<= 大于等于>= 大于>
逻辑运算符:
包括:and or not(!)
数学操作符 加+ 减- 乘* 除/ 取模% 幂指数^
注意:在我们的与和或没有一些符号表达式,其他的和c语言java语言中的都是相似的
自动注入的总结
我们在使用autowired时候参数可以是byType和byName,一个是按照类型,一个是按照名字
byType
按照类型,如果发现多个抛异常
没找到就是null
byName
按照属性名称找容器中有相同名称的bean如果没有找到null
自动装配的缺点:
不能够装配个别的属性
只能根据类型或者名字两者中的一个来进行装配不能兼备
在classpath自动扫描bean组件
spring能在classpath下自动扫描,侦测和实例化具有特定注解的组件
特定的组件包括:
@component:基本注解,标记一个受spring管理的组件
@respository:表示持久性组件(dao)
@service表示服务层组件(servlet)
@controller(表示表现层组件)
对于扫描到的组件,spring有默认的命名策略,使用类名但是第一个字母要小写,但是我们可以在注解中通过value属性标识组件的名称
下面是代码示例讲解
第一部分
<context:component-scan base-package="com.zzxtit.spring.ioc.auto"></context:component-scan>
//这是我们使用classpath之后我们xml中的代码,我们只需要在xml
//文件中除了环境配置之外再加一句这话就好了
//剩下的工作就是让他进行自动的扫描的
//如果我们想要让他同时扫描两个包,我们可以在classpath中加入两个路径,中间使用逗号进行分割
第二部分
//这是我们的xml代码
<bean id="userDao" class="com.zzxtit.spring.ioc.auto.UserDao"
p:name="wei" p:age="1"></bean>//我们如果想要对我们注入的对象进行赋值操作的时候 我们还是要在我们的xml文件中进行相应的操作
<context:component-scan base-package="com.zzxtit.spring.ioc.auto"></context:component-scan>
//这是我们的main函数代码
public static void main(String[] args) {
ApplicationContext ioc=new ClassPathXmlApplicationContext("config/applicationContext_auto.xml");
UserService us=ioc.getBean("userService", UserService.class);//id默认是类名首字母小写
System.out.println("===="+us.getUdao());
}
//这是我们的udao代码
@Repository
public class UserDao {
String name;
int age;
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;
}
@Override
public String toString() {
return "UserDao [name=" + name + ", age=" + age + "]";
}
//记得写set方法
}
@Service
public class UserService {
private UserDao udao;
private String userName;
public UserService() {
super();
}
public UserService(UserDao udao, String userName) {
super();
this.udao = udao;
this.userName = userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public UserDao getUdao() {
return udao;
}
public String getUserName() {
return userName;
}
@Autowired
@Qualifier("userDao")//如果我们的bean类型有多个匹配的时候
//我们单纯的使用autowire就会报错
//此时我们可以加属性qualifier标注我们要注入的类名
//类名的首字母还是要记住小写
public void setUdao(UserDao udao) {
this.udao = udao;
}
@Override
public String toString() {
return "UserService [udao=" + udao + ", userName=" + userName + "]";
}
public void test() {
System.out.println("===="+userName);
System.out.println("----->"+udao);
}
}
补充
@Authwired 注解也可以应用在数组类型的属性上, 此时 Spring 将会把所有匹配的 Bean 进行自动装配.
@Authwired 注解也可以应用在集合属性上, 此时 Spring 读取该集合的类型信息, 然后自动装配所有与之兼容的 Bean.
@Authwired 注解用在 java.util.Map 上时, 若该 Map 的键值为 String, 那么 Spring 将自动装配与之 Map 值类型兼容的 Bean, 此时 Bean 的名称作为键值