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 的名称作为键值


版权声明:本文为xiao_le_原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
THE END
< <上一篇
下一篇>>